class B { /* ... */ };
class A {
public:
A() { obj = NULL; }
private:
static B* obj;
};
然而,这会产生大量链接器错误,符号 obj 未解析。
没有这些链接器错误的私有静态类成员的“正确”方法是什么?
答案 0 :(得分:6)
你需要这样定义:
这是在标题中:
class B { ... }
class A {
public:
A() { obj = NULL; }
private:
static B* obj;
}
这是在源
B* A::obj = NULL;
答案 1 :(得分:6)
您需要添加
B *A::obj = NULL;
到你的一个cpp文件。另请注意,如果在A的构造函数中设置obj,则意味着无论何时创建A对象,都会再次重置obj - 因为它是静态的,所以只有一个obj在所有A实例之间共享。
答案 2 :(得分:3)
您必须在cpp文件中初始化obj:
B* A::obj = NULL;
不允许在构造函数中初始化它,因为它是一个静态变量。
答案 3 :(得分:3)
http://www.parashift.com/c++-faq/ctors.html#faq-10.12
(正如@peoro所说,请记得用;
结束每个班级定义。
答案 4 :(得分:1)
链接错误是因为您还需要在类定义之外声明静态变量,仅用于链接目的和静态内存分配
B* A::obj;
答案 5 :(得分:1)
您声明了静态成员,但没有定义它。
此外,无论何时构造A的任何实例,您都要设置其值,而实际上您只需要初始化一次。
class B;
class A {
private:
static B* obj;
};
B* A::obj = NULL;
由于您的类A定义可能位于头文件中,因此您应该确保obj(我添加的)的定义只在一个(和一个).cpp文件中。这是因为它必须在编译的项目中只出现一次,但是头文件的内容可能多次#included
。