我正在阅读Scott Meyers的C ++并且遇到了这个例子:
class GamePlayer{
private:
static const int NumTurns = 5;
int scores[NumTurns];
// ...
};
您在上面看到的是
NumTurns
的声明,而不是定义。
为什么不定义?看起来我们用5初始化静态数据成员。
我只是不明白声明是什么意思但没有定义一个值为5的变量。我们可以把变量的地址变好。
class A
{
public:
void foo(){ const int * p = &a; }
private:
static const int a = 1;
};
int main ()
{
A a;
a.foo();
}
答案 0 :(得分:2)
因为它不是定义。必须在类定义之外定义静态数据成员。
[class.static.data] / 2
在其类定义中声明
static
数据成员不是 定义,除了cv-qualified之外,可能是不完整的类型void
。static
数据成员的定义应出现在 命名空间范围包含成员的类定义。
至于获取静态成员的地址而不实际定义它,它将编译,但不应该链接。
答案 1 :(得分:1)
您需要在源文件中添加NumTurns
的定义,例如
const int GamePlayer::NumTurns;