无法设置静态对象字段的值(错误LNK2001:无法parsing的外部符号)
我看起来很简单直接的代码片段,这是我正在写一个游戏中遇到的一个简化版本的问题。 我正在尝试在一个类中将静态字段设置为我的主要方法中的另一个值。 但是这个代码不会,我不明白为什么。
我得到错误
1> Source.obj:error LNK2001:无法parsing的外部符号“public:static class A * B :: a”(?a @ B @@ 2PAVA @@ A)
class A { public: A() { } }; class B { public: static A* a; }; int main() { B::a = new A; }
有什么规则说,我必须在类之外定义我的静态类成员以使其链接?
从你的评论
但是这个定义的规则是什么呢?
它说,从c + +参考
定义和ODR
定义是完全定义由声明引入的实体的声明。 每个声明都是一个定义,除了以下内容:
…
4)在类定义中声明一个静态数据成员
struct S { // defines S int n; // defines S::n static int i; // declares, but doesn't define S::i }; int S::i = 0; // defines and initializes S::i
作为一个额外的参考,你也可以在这里查看维基百科, 一个定义规则
更新:
我终于find了目前(2014年6月2日) 最新免费提供的标准参考 (目前发布的标准的副本可用,价格大约为30美元):
§9.4.2
2静态数据成员在其类定义中的声明不是一个定义,可能是一个不完整的types,而不是cv合格的void。 静态数据成员的定义应该出现在包含成员类定义的命名空间范围内。 在命名空间范围的定义中,静态数据成员的名称应该使用::运算符通过它的类名进行validation。 静态数据成员定义中的初始化expression式在它的类的范围内
您没有定义静态数据成员。 你只在类定义中声明它。 添加以下行
A * B::a;
之前主要。
或者你可以使用operator new初始化它。
A * B::a = new A;
至于你的问题
有什么规则说,我必须在类之外定义我的静态类成员以使其链接?
那么根据第9.4.2节C.2标准的静态数据成员的第2段
2类定义中静态数据成员的声明不是一个定义 ,可能是一个不完整的types,而不是cv-qualified void。 静态数据成员的定义应出现在包含成员的类定义的命名空间范围内。