我想实现一个功能,我可以知道使用特定类创建了多少对象。
我尝试了以下内容:
myClass.h
class myClass {
private:
static int internalCounter;
int id;
public:
myClass(): id(internalCounter) {internalCounter++;}
}
问题是C ++不允许这样做,我不知道如何解决这个问题。 我在SA中看到过类似的问题,其答案提示如下:
myClass::internalCounter = 0;
但我不认为这在语法层面上是正确的。
答案 0 :(得分:5)
C ++ 允许这样做。但是静态变量需要一个定义,听起来就像缺少那样。您需要将其放在源文件(而不是标题)
中int myClass::internalCounter = 0;
= 0
是可选的,因为默认情况下静态变量是零初始化的,但您可能更喜欢显式。
答案 1 :(得分:2)
您需要将静态变量定义为
int myClass::internalCounter = 0;
在实施文件中。
答案 2 :(得分:2)
你看到的另一个建议几乎是正确的。你需要这样的东西:
int myClass::internalCounter = 0;
但它需要进入源文件(* .cpp)而不是标题。该行是必要的,因为它自己的声明(在头文件中)永远不会被实例化。在源文件中解析它意味着它将在特定的翻译单元中被拾取和实例化。
答案 3 :(得分:2)
您必须定义静态变量:
int myClass::internalCounter=0;
在你的实现文件中,总是最好读取你的编译器/链接器输出,如果是g ++,它是:
main.cpp:(.text.startup+0x2): undefined reference to `myClass::internalCounter'
undefined reference
表示未定义,这是您必须在代码中修复的内容的提示
答案 4 :(得分:0)
我建议你,因为你需要把你的计数器放到一个源文件中,你将它的定义从类中取出并将它放入匿名命名空间区域。这会从您的头文件中获取您的类的一些实现细节。
如果您使用的是C ++ 11,请使用atomic_int
而不是int
。
使用后增量运算符使动作正确原子。
<强> myClass.h 强>
class myClass
{
private:
int id;
public:
myClass();
// etc
};
<强> myClass.cpp 强>
#include <atomic>
#include "myClass.h"
namespace {
static std::atomic_int internalCounter;
}
myClass::myClass()
: id( internalCounter++ )
{
}
在atomic_int上的operator++
后增量,顾名思义就是原子,所以它将是线程安全的。