静态成员必须初始化?

时间:2013-11-01 19:27:07

标签: c++ class static-members

代码如下:

#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()之前

。然后,一切都很好。这是什么原因?

2 个答案:

答案 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)

一旦创建了一个类对象,某些编译器就不允许在没有初始化的情况下创建静态变量。