代码如下:
#include <iostream>
using namespace std;
class A {
static int id_;
public:
static void setId(int id) {
id_ = id;
}
static int getId() {
return id_;
}
};
int main()
{
A::setId(10);
cout << A::getId() << endl;
return 0;
}
当我在 Xcode , Mac OS 中编译时,会出现错误消息:
Undefined symbols for architecture x86_64:
"A::id_", referenced from:
A::setId(int) in main.o
A::getId() 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)
如果我添加以下行:
int A::id_ = 10;
在main()
之前。然后,一切都很好。这是什么原因?
答案 0 :(得分:3)
变量需要声明和定义,draft C++ standard部分9.4.2
静态数据成员说:< / p>
在类定义中声明静态数据成员不是定义[...]
所以必须定义,这就是你需要添加:
的原因int A::id_ = 10;
为了更清楚地看到这一点,我们看到了:
int A::id_ ;
就足够了,我们不必初始化A::id_
只需 define 。
您可能还想阅读此前一个帖子:What is the difference between a definition and a declaration?。
史蒂夫指出,当您转向使用标题文件时,您需要define your variable in the cpp file,因为您不需要多个定义。
答案 1 :(得分:2)
一旦创建了一个类对象,某些编译器就不允许在没有初始化的情况下创建静态变量。