如何初始化C ++中的私有静态成员?
在C ++中初始化私有静态数据成员的最佳方法是什么? 我在我的头文件中试过,但它给我奇怪的链接器错误:
class foo
{
private:
static int i;
};
int foo::i = 0;
我猜这是因为我无法从课堂外初始化私人成员。 那么做这件事的最好方法是什么?
类声明应该在头文件中(或者如果不共享,则在源文件中)。
文件:foo.h
class foo
{
private:
static int i;
};
但初始化应该在源文件中。
文件:foo.cpp
int foo::i = 0;
如果初始化位于头文件中,则包含头文件的每个文件都将具有静态成员的定义。 因此,在链接阶段,您将获得链接器错误,因为初始化变量的代码将在多个源文件中定义。
注意:Matt Curtis指出,如果静态成员变量是const int类型(例如int
, bool
, char
),C ++允许简化上述内容。 然后,您可以直接在头文件的类声明中声明和初始化成员变量:
class foo
{
private:
static int const i = 42;
};
对于一个变量 :
foo.h中:
class foo
{
private:
static int i;
};
Foo.cpp中:
int foo::i = 0;
这是因为程序中只能有一个foo::i
实例。 它在头文件中相当于extern int i
,在源文件中是int i
。
对于常量,您可以将该值直接放入类声明中:
class foo
{
private:
static int i;
const static int a = 42;
};
对于这个问题的未来观众,我想指出,你应该避免monkey0506提出的建议。
头文件用于声明。
头文件会为每一次编译.cpp
文件直接或间接#includes
他们,代码的任何功能,在程序初始化运行之外,之前main()
通过放: foo::i = VALUE;
到头文件中, foo:i
将为每个.cpp
文件分配值VALUE
(不管那是什么),并且这些赋值将在main()
运行之前以不确定的顺序(由链接器确定)发生。
如果我们将#define VALUE
设置为我们的.cpp
文件中的另一个数字,该怎么办? 它会编译得很好,我们将无法知道哪一个获胜,直到我们运行该程序。
永远不要将执行的代码放入标题中,原因与您从不#include
.cpp
文件相同。
包括守卫(我同意你应该总是使用它)保护你免受不同的事情的影响:同一个头文件在编译单个.cpp
文件时间接地#include
d多次