必须初始化静态成员
Static member has to be initialized?
代码如下:
#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 文件中定义变量,因为您不需要多个定义。
一旦类对象被创建,某些编译器不允许在没有初始化的情况下创建静态变量。
相关文章:
- C++模板类静态成员初始化
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 向模板化静态成员初始化添加和不添加'typename'都会出错
- 模板类中的静态成员初始化
- 模板专用化和静态成员初始化
- 静态内联方法无需静态成员初始化
- 静态成员初始化链接错误
- 类内静态成员初始化
- 跨系统的静态成员初始化
- C++类静态成员初始化
- gcc中模板的非延迟静态成员初始化
- Clang++Xcode 4.4非静态成员初始化和移动构造函数
- 为什么静态成员初始化需要"typed again"?
- 即使启用了 C++11,静态成员初始化也不适用于 GCC
- C++静态成员初始化顺序
- 常量静态成员初始化 - 类定义内部与外部类定义
- 如何保证 const 静态成员初始化顺序
- 在单独的库中使用 CRTP 进行静态成员初始化
- 静态成员初始化和可变模板
- 模板化的外部类静态成员初始化