定义私有静态类成员

时间:2011-01-02 18:28:10

标签: c++ class static member

class B { /* ... */ };

class A {
public:
    A() { obj = NULL; }
private:
    static B* obj;
};

然而,这会产生大量链接器错误,符号 obj 未解析。

没有这些链接器错误的私有静态类成员的“正确”方法是什么?

6 个答案:

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