为啥我无法在 C++ 中初始化静态字段 [重复]

Posted

技术标签:

【中文标题】为啥我无法在 C++ 中初始化静态字段 [重复]【英文标题】:Why I cannot initialize static field in C++ [duplicate]为什么我无法在 C++ 中初始化静态字段 [重复] 【发布时间】:2012-08-10 15:42:10 【问题描述】:

可能重复:Defining static members in C++

我正在研究 C++,但我不明白如何在 C++ 中使用静态字段,它们似乎没用。请纠正我。

我做不到:

class AClass
    public:
        static int static_field = 0;
;

这也不起作用

class AClass
    public:
        static int static_field;
;

int main()
    int AClass::static_field = 0;
    return 0;

【问题讨论】:

@w00te 和其他人已经回答了这个问题。我认为您的困惑源于在 C++ 中 declarationdefinition 是两个不同的东西。一个使符号可见,另一个分配存储空间。搜索“C++ 声明与定义”或类似内容。 人力资源管理?我的答案有最长的计时器,我不记得在任何地方使用过这个词的定义。来自 MSFT:“声明:是没有以下定义的类名声明,例如类 T;。”这就是他在第二个代码示例中的内容。 【参考方案1】:

其实你已经很接近了。

您应该移动:int AClass::static_field = 0;main() 之外,因此它在 CPP 文件中是全局的,最好是 AClass.cpp.

这样,您可以在标头中声明它并在源文件中对其进行初始化。设置好此声明/初始化后,您可以在main() 或其他任何地方使用它,只需执行AClass::static_field

PS:它们绝对不是没用的。

这是一个很好的用例...假设您有内存泄漏并且您需要跟踪它们。您在类中放置了一个静态计数器,因此该类的所有实例都共享它。然后,您可以使任何构造函数/析构函数递增和递减该计数器。因此,您可以打印计数器以显示存在多少个类的实例,以帮助找到您的漏洞。

【讨论】:

【参考方案2】:

您必须在主函数范围之外初始化 static_field。

int AClass::static_field = 0;
int main()

【讨论】:

【参考方案3】:

试试这个:

class AClass
    public:
        static int static_field;
;

int AClass::static_field = 0;

int main()
    return 0;

【讨论】:

【参考方案4】:

当你在这里声明一个静态变量时,你是在声明这个变量的一个实例将在类的所有实例之间共享。

像提供的其他一些答案一样,将声明移到主函数之外是正确的解决方案。

以下是 msdn 关于 static 关键字的一些文档:

http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx

希望对你有帮助

【讨论】:

以上是关于为啥我无法在 C++ 中初始化静态字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++:为啥我的 DerivedClass 的构造函数无法访问 BaseClass 的受保护字段?

为啥我可以通过反射在字段初始化后重写静态只读字段?

C # 如何连接到sql 数据库 要详细的代码,为啥显示字段初始值无法引用非静态字段?!

如何在 C++ 中初始化静态字段? [复制]

为啥我的 C++ 文件无法运行 [重复]

为啥静态字段初始化失败导致NoClassDefFoundError?