在 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;
如果初始化在头文件中,那么包含头文件的每个文件都将具有静态成员的定义。因此,在链接阶段,你将收到链接器错误,因为初始化变量的代码将在多个源文件中定义。的初始化static int i
必须在任何函数之外完成。
注意: Matt Curtis:指出如果静态成员变量是 const int 类型(例如int
, bool
, char
),C++ 允许简化上述内容。然后可以直接在头文件的类声明中声明和初始化成员变量:
class foo
{
private:
static int const i = 42;
};
是的。但我假设问题已被简化。从技术上讲,声明和定义都可以在一个源文件中。但这会限制其他类对类的使用。
实际上不仅仅是 POD,它也必须是一个 int 类型(int、short、bool、char...)
请注意,这不仅仅是值如何初始化的问题:像这样定义的 const 整数类型可能会被实现转换为编译时常量。这并不总是你想要的,因为它增加了二进制依赖:如果值改变,客户端代码需要重新编译。
@Martin:除了更正 s/POD/integral type/,如果地址被占用,那么还需要有一个定义。听起来很奇怪,在类定义中带有初始化程序的声明并不是定义。该模板常量成语提供了你需要在头文件中定义的情况下,一种解决方法。另一个更简单的解决方法是使用生成局部静态常量值的函数。干杯 & hth.,
您可以添加说明 int foo::i =0; 不应在函数内部(包括主函数)。我在我的主要功能开始时有它,但它不喜欢那样。