必须初始化静态成员



代码如下:

#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,MacOS中编译它时,有一条错误消息:

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()之前.然后,一切都很好。这是什么原因?

需要声明定义变量,并且9.4.2静态数据成员C++标准部分的草案 说:

静态数据成员在其类定义中的声明不是定义 [...]

所以必须定义它,这就是为什么你需要添加:

int A::id_ = 10;

为了更清楚地看到这一点,我们看到:

int A::id_ ;

就足够了,我们不必初始化A::id_只需定义它。

您可能还想阅读之前的线程:定义和声明之间有什么区别?

正如 Steve 指出的那样,当您转向使用文件时,您需要在 cpp 文件中定义变量,因为您不需要多个定义。

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

最新更新