计算从类创建的对象数

时间:2014-01-22 16:14:58

标签: c++

我想实现一个功能,我可以知道使用特定类创建了多少对象。

我尝试了以下内容:

myClass.h

class myClass {
private:
    static int internalCounter;
    int id;
public:
    myClass(): id(internalCounter) {internalCounter++;}
}

问题是C ++不允许这样做,我不知道如何解决这个问题。 我在SA中看到过类似的问题,其答案提示如下:

myClass::internalCounter = 0;

但我不认为这在语法层面上是正确的。

5 个答案:

答案 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++后增量,顾名思义就是原子,所以它将是线程安全的。