为啥我无法在 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++ 中 declaration 和 definition 是两个不同的东西。一个使符号可见,另一个分配存储空间。搜索“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 的受保护字段?