我已声明一个公共静态成员来保留我班级实例的总数。代码如下:
class Hello {
public:
static int myCount;
void test(){
//do nothing
};
Hello(){
Hello::myCount += 1;
};
~Hello() {
Hello::myCount -= 1;
}
};
int main(int argc, const char * argv[]) {
// insert code here...
Hello *p1 = new Hello();p1->test();
Hello *p2 = new Hello();p2->test();
cout << Hello::myCount;
return 0;
}
然而,我在编译时说:
Undefined symbols for architecture x86_64:
"Hello::myCount", referenced from:
_main in main.o
Hello::Hello() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我不知道我错在哪里。从我上次使用c ++开始已经好几年了,你能不能建议一个解决方案? 谢谢。
答案 0 :(得分:2)
必须在类之外定义静态成员,例如:
class Hello {
public:
static int myCount;
void test(){
//do nothing
};
Hello(){
Hello::myCount += 1;
};
~Hello() {
Hello::myCount -= 1;
}
};
int Hello::myCount = 0; // definition outside of the class
(...)
以下示例显示,它有助于解决您的问题:http://ideone.com/LVXVCc
这完全是因为一个名为一个定义规则的规则 您可以在静态类成员here的上下文中阅读有关此内容的更多信息。
简而言之:static int myCount
声明不是成员的定义。类通常放在他们的.h/.hpp
头文件中,并包含在许多其他文件中。如果那些包含静态成员和上面的行将是一个定义,它将导致多重定义错误。
为防止这种情况发生,此声明不会被视为定义,您必须稍后自行定义。