2013-11-01 163 views
0

的代码如下:静态成员必须初始化?

#include <iostream> 

using namespace std; 

class A { 
    static int id_; 

public: 
    static void setId(int id) { 
     id_ = id; 
    } 
    static int getId() { 
     return id_; 
    } 
}; 

int main() 
{ 
    A::setId(10); 
    cout << A::getId() << endl; 
    return 0; 
} 

当我编译它在Xcode中的Mac OS,有一个错误信息:

Undefined symbols for architecture x86_64: 
    "A::id_", referenced from: 
     A::setId(int) in main.o 
     A::getId() in main.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

如果我添加一行:

int A::id_ = 10; 

之前的main()。然后,一切都很好。这是什么原因?

+3

因为这就是声明静态成员的方式。 – 0x499602D2

+2

@ 0x499602D2:**定义** –

回答

3

变量需要声明定义draft C++ standard9.4.2静态数据成员说:

在其类定义的静态数据成员的声明是不是定义[。 ..]

所以它必须是定义,这就是为什么你需要添加:

int A::id_ = 10; 

,并看到这个更清楚,我们看到:

int A::id_ ; 

就足够了,我们没有初始化A::id_只是定义它。

您可能还想阅读以前的主题:What is the difference between a definition and a declaration?

正如史蒂夫指出,当你移动到使用标题文件,你将需要define your variable in the cpp file,因为你不想有多个定义。

+1

如果将类移动到头文件中,如果项目变大,会发生这种情况,该定义必须位于.cpp文件中。 –

+0

@SteveHoward好点,修改我的答案。 –

2

一旦使某个类对象成为特定的编译器,不允许在没有初始化的情况下创建静态变量。