C++ 将函数定义为静态成员和自由成员之间有什么区别?
考虑以下代码段:C++ 将函数定义为静态成员和自由成员之间有什么区别?,c++,overloading,C++,Overloading,考虑以下代码段: #include <iostream> using namespace std; struct Element { void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; } }; struct ElementQuery { ElementQuery(Element * e) : element(e) { } Element
#include <iostream>
using namespace std;
struct Element {
void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; }
};
struct ElementQuery {
ElementQuery(Element * e) : element(e) { }
Element * Get() const { return element; }
Element * element;
};
namespace A {
static void SetVisible(ElementQuery const& element, bool show) {
cout << "Called SetVisible on ElementQuery" << endl;
SetVisible(element.Get(), show);
}
static void SetVisible(Element * element, bool show) {
element->SetVisible(show);
}
};
int main() {
Element * e = new Element();
ElementQuery q(e);
A::SetVisible(q, true);
delete e;
return 0;
}
#包括
使用名称空间std;
结构元素{
void SetVisible(bool){cout似乎根本不应该编译此代码。因为此调用:
SetVisible(element.Get(),show);
$void SetVisible(Element*Element,bool show)在调用时不可见。您需要将此函数移到$void SetVisible(ElementQuery const&Element,bool show)之前。似乎根本不应该编译此代码。因为此调用:
SetVisible(element.Get(),show);
$void SetVisible(Element*Element,bool show)在调用时不可见。您需要将此函数移到$void SetVisible(ElementQuery const&Element,bool show)之前。这是因为命名空间是按顺序处理的,并且元素和ElementQuery之间存在转换(因为您的构造函数不显式)
这是正确的代码
#include <iostream>
using namespace std;
struct Element {
void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; }
};
struct ElementQuery {
explicit ElementQuery(Element * e) : element(e) { }
Element * Get() const { return element; }
Element * element;
};
namespace A {
static void SetVisible(Element * element, bool show) {
cout << "Called A::SetVisible on Element" << endl;
element->SetVisible(show);}
static void SetVisible(ElementQuery const& element, bool show) {
cout << "Called A::SetVisible on ElementQuery" << endl;
SetVisible(element.Get(), show);
}
};
int main() {
Element * e = new Element();
ElementQuery q(e);
A::SetVisible(q, true);
delete e;
return 0;
}
#包括
使用名称空间std;
结构元素{
void SetVisible(bool){cout这是因为名称空间是按顺序处理的,并且元素和ElementQuery之间存在转换(因为构造函数不是显式的)
这是正确的代码
#include <iostream>
using namespace std;
struct Element {
void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; }
};
struct ElementQuery {
explicit ElementQuery(Element * e) : element(e) { }
Element * Get() const { return element; }
Element * element;
};
namespace A {
static void SetVisible(Element * element, bool show) {
cout << "Called A::SetVisible on Element" << endl;
element->SetVisible(show);}
static void SetVisible(ElementQuery const& element, bool show) {
cout << "Called A::SetVisible on ElementQuery" << endl;
SetVisible(element.Get(), show);
}
};
int main() {
Element * e = new Element();
ElementQuery q(e);
A::SetVisible(q, true);
delete e;
return 0;
}
#包括
使用名称空间std;
结构元素{
void SetVisible(bool){类中任何地方声明的cout成员在类中的任何地方都可见。我认为没有比这更重要的了。很好的例子说明了为什么构造函数应该是显式的。If ElementQuery(Element*e)如果是显式的,代码甚至不会编译。Charles Bailey引用的问题的大多数投票结果都向我表明了这一点。如果你让Tomek建议的构造函数显式,并在命名空间A中切换SetVisible函数的顺序,那么works@wreckgar23@CharlesBailey好的,现在我明白了,你能详细说明一个简短的答案吗?还有m点estruct
的作用域以这种方式扩展的原因是什么。@Crankgar23:我怀疑这项功能是为类添加的,因为预计一个类相对于整个程序来说相当小,因此在声明之前就在作用域中的东西是合理无误的。没有它是从C继承的,编译器对多个通道会感到困惑,但是在C++的时候,它更让程序员感到困惑。在类中的任何地方声明的成员在类中到处可见。我认为没有比它更重要的东西。为什么构造函数应该是显式的伟大例子。如果元素查询(要素*e)如果是显式的,代码甚至不会编译。Charles Bailey引用的问题的大多数投票结果都向我表明了这一点。如果你让Tomek建议的构造函数显式,并在命名空间A中切换SetVisible函数的顺序,那么works@wreckgar23@CharlesBailey好的,现在我明白了,你能详细说明一个简短的答案吗?还有m点estruct
的作用域以这种方式扩展的原因是什么。@Crankgar23:我怀疑这项功能是为类添加的,因为预计一个类相对于整个程序来说相当小,因此在声明之前就在作用域中的东西是合理无误的。没有它是从C继承的,编译器对多个通道会感到困惑,但是在C++的时候,它更容易混淆程序员。你可以尝试编译它。因为代码> EntQueQue>代码有一个隐含的构造函数,它把<代码>元素*/COD>作为参数。你可以试试。它编译为<代码>元素tQuery
具有隐式构造函数,该构造函数将元素*
作为参数。