为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
茅侃侃 2019-06-04 17:24:46
如何在C+中初始化私有静态成员?在C+中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这一点,但是它给了我奇怪的链接器错误:class foo{     private:         static int i;};int foo::i = 0;我猜这是因为我无法从类之外初始化私有成员。那么最好的方法是什么?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

类声明应该在头文件中(如果不共享,则在源文件中)。
档案:foo.h

class foo{
    private:
        static int i;};

但是初始化应该在源文件中。
档案:foo.cpp

int foo::i = 0;

如果初始化在头文件中,则包含头文件的每个文件都有静态成员的定义。因此,在链接阶段,您将得到链接器错误,因为初始化变量的代码将在多个源文件中定义。

注:MattCurtis:指出如果静态成员变量为Constint类型,则C+允许简化上述内容。intboolchar)。然后,可以在头文件中的类声明中直接声明和初始化成员变量:

class foo{
    private:
        static int const i = 42;};


查看完整回答
反对 回复 2019-06-04
?
绝地无双

TA贡献1946条经验 获得超4个赞

为了变量:

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;};


查看完整回答
反对 回复 2019-06-04
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

头文件用于声明。

头文件每编译一次.cpp直接或间接地#includes它们和任何函数之外的代码都在程序初始化时运行,在此之前。main().

提出:foo::i = VALUE;进入头部,foo:i将被分配值VALUE(不管是什么).cpp文件,这些赋值将以不确定的顺序(由链接器确定)在此之前发生。main()都跑了。

如果我们#define VALUE成为我们中的一个不同的数字.cpp档案?它会编译得很好,在我们运行程序之前,我们将无法知道哪一个赢了。

不要将已执行的代码放入头中,原因与您从未执行过的原因相同。#include a .cpp档案。

包括护卫(我同意你应该经常使用),保护你不受不同的东西影响:相同的标题是间接的。


查看完整回答
反对 回复 2019-06-04
  • 3 回答
  • 0 关注
  • 1166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信