无法设置静态对象字段的值(错误LNK2001:未解析的外部符号)

pop*_*lop 2 c++ static compiler-errors

我的代码看似简单明了,是我正在编写的游戏中遇到的问题的简化版本。我正在尝试将main方法中的一个静态字段设置为另一个值。但是这段代码不会,我也不明白为什么。

我得到错误

1> Source.obj:错误LNK2001:未解析的外部符号“ public:静态类A * B :: a”(?a @ B @@ 2PAVA @@ A)

class A
{
public:
    A()
    {

    }
};

class B
{
public:
    static A* a;
};

int main()
{
    B::a = new A;
}
Run Code Online (Sandbox Code Playgroud)

我必须在类之外定义静态类成员才能使其链接的规则是什么?

πάν*_*ῥεῖ 5

根据您的评论

但是定义它的规则是什么?

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
Run Code Online (Sandbox Code Playgroud)

作为其他参考,您还可以在此处检查Wikipedia,一个定义规则

更新:
我终于找到了当前(2014年6月2日)最新的免费标准参考文件(我认为,当前发布的标准副本的价格约为30美元):

第9.4.2节

2在其类定义中声明静态数据成员不是定义,并且可以是不完整的类型,而不是cv限定的void。静态数据成员的定义应出现在包含该成员的类定义的名称空间范围中。在命名空间范围的定义中,静态数据成员的名称应使用::运算符通过其类名称进行限定。定义静态数据成员的初始化器表达式在其类的范围内