计算从类创建的对象数

Count number of objects created from a class

本文关键字:对象 创建 计算      更新时间:2023-10-16

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

我尝试了以下内容:

myClass.h

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

问题是C 不允许这样做,我不确定如何解决此问题。我在SA中看到了类似的问题,其中答案暗示了类似的问题:

myClass::internalCounter = 0;

,但我认为这在语法级别上不正确。

c dies 允许这样做。但是静态变量需要一个定义,听起来像是缺少的。您需要将其放入源文件(而不是标题)

int myClass::internalCounter = 0;

= 0是可选的,因为静态变量默认情况下是零置序列化的,但您可能更喜欢明确。

您需要将静态变量定义为

int myClass::internalCounter = 0;

在实现文件中。

您看到的另一个建议几乎是正确的。您需要这样的东西:

int myClass::internalCounter = 0;

,但需要进入源文件(*.cpp)而不是标题。该行是必要的,因为单独声明(在标题文件中)否则将永远不会实例化。在源文件中解决它意味着它将被拾取并在特定的翻译单元中实例化。

您必须定义静态变量:

 int myClass::internalCounter=0;

在您的实现文件中,始终最好读取您的编译器/链接器输出,如果G ,则是:

main.cpp:(.text.startup+0x2): undefined reference to `myClass::internalCounter'

undefined reference表示未定义,这是您必须在代码中修复的提示

我会建议,当您需要将计数器放入源文件中时,您将其定义从类中取出,然后将其放入匿名的名称空间区域。这将类的一些实施细节从您的标题文件中删除。

如果您在C 中工作11使用atomic_int而不是int

使用inccrement算子使操作正确原子。

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++ inomic_int提示是原子能的,因此它将是线程的。