2012-07-06 150 views
0

从我所了解的情况来看,你在.cpp文件中初始化一个静态成员而不是在.h中的原因是这样就没有风险去获得该成员的多个实例。在C++中初始化静态成员

//Foo.h 
    #ifndef FOO_H 
    #define FOO_H 

    class Foo{ 
     static int a; 

    }; 
    int Foo::a = 95; 
    #endif 

预处理指令确保这个.h文件只编译一次,这确保只有一个静态成员的实例。这是可能的,而不是启动.cpp文件中的静态成员?

+0

.h文件根本不编译。 Foo_H设置为Foo.h不会被多次包含 – Andrew 2012-07-06 11:05:31

+0

[Static Data Member Initialization]的可能重复(http://stackoverflow.com/questions/11300652/static-data-member-initialization) – dasblinkenlight 2012-07-06 11:11:03

回答

4

考虑有两个源代码文件,a.cppb.cpp,都包含头。由于它们是彼此独立编译的,所以标头守卫将不起作用,您将以两个对象文件a.ob.o均为定义Foo:a结束。尝试将它们连接在一起将会失败。

7

不,它只能确保每个编译单元(.cpp文件)包含Foo.h一次。不在整个项目中。你应该定义静态成员中Foo.cpp

3

这将导致链接错误,如果头被包含在多个.cpp文件(翻译单元):

//a.cpp 
#include <Foo.h> 

//b.cpp 
#include <Foo.h> 

编译后,a.obj包含Foo::ab.obj定义包含Foo::b的定义。如果试图将这两个文件链接成单个二进制文件,将会发生多重定义错误。

1

不,包含的警卫确保每个编译单元最多包含一个标头。如果你的程序有多个编译单元(.cpp文件),包括头文件,那么你将最终得到Foo::a的多个定义。