如何在C+中初始化私有静态成员?

如何在C+中初始化私有静态成员?

在C+中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这一点,但是它给了我奇怪的链接器错误:

class foo{
    private:
        static int i;};int foo::i = 0;

我猜这是因为我无法从类之外初始化私有成员。那么最好的方法是什么?


茅侃侃
浏览 1173回答 3
3回答

撒科打诨

类声明应该在头文件中(如果不共享,则在源文件中)。档案:foo.hclass foo{     private:         static int i;};但是初始化应该在源文件中。档案:foo.cppint foo::i = 0;如果初始化在头文件中,则包含头文件的每个文件都有静态成员的定义。因此,在链接阶段,您将得到链接器错误,因为初始化变量的代码将在多个源文件中定义。注:MattCurtis:指出如果静态成员变量为Constint类型,则C+允许简化上述内容。int, bool, char)。然后,可以在头文件中的类声明中直接声明和初始化成员变量: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;};

回首忆惘然

头文件用于声明。头文件每编译一次.cpp直接或间接地#includes它们和任何函数之外的代码都在程序初始化时运行,在此之前。main().提出:foo::i = VALUE;进入头部,foo:i将被分配值VALUE(不管是什么).cpp文件,这些赋值将以不确定的顺序(由链接器确定)在此之前发生。main()都跑了。如果我们#define VALUE成为我们中的一个不同的数字.cpp档案?它会编译得很好,在我们运行程序之前,我们将无法知道哪一个赢了。不要将已执行的代码放入头中,原因与您从未执行过的原因相同。#include a .cpp档案。包括护卫(我同意你应该经常使用),保护你不受不同的东西影响:相同的标题是间接的。
打开App,查看更多内容
随时随地看视频慕课网APP