如何初始化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类型(例如intboolchar ),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多次

链接地址: http://www.djcxy.com/p/17289.html

上一篇: How to initialize private static members in C++?

下一篇: How to handle optional parameters in function