C++ 计算从类创建的对象数

C++ 计算从类创建的对象数,c++,C++,我想实现一个功能,在这个功能中,我可以知道使用特定类在何处创建了多少对象 我尝试了以下方法: myClass.h class myClass { private: static int internalCounter; int id; public: myClass(): id(internalCounter) {internalCounter++;} } class myClass { private: int id; public: myC

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

我尝试了以下方法:

myClass.h

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

  public:
    myClass();
   // etc
};
问题是C++不允许这样做,我不知道如何解决这个问题。 我在SA中看到过类似的问题,其中的答案建议如下:

myClass::internalCounter = 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++确实允许这样做。但是静态变量需要一个定义,听起来好像没有定义。您需要将其放入源文件(而不是头文件)中


=0
是可选的,因为静态变量在默认情况下是零初始化的,但您可能更喜欢显式的。

我建议,由于您无论如何都需要将计数器放入源文件中,您可以将其定义从类中取出,并将其放入匿名命名空间区域。这将从头文件中删除类的一些实现细节

如果您使用的是C++11,请使用
atomic_int
而不是
int

使用后增量运算符使操作正确原子化

myClass.h

class myClass {
private:
    static int internalCounter;
    int id;
public:
    myClass(): id(internalCounter) {internalCounter++;}
}
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++ )
{
}
#包括
#包括“myClass.h”
命名空间{
静态std::原子计数器;
}
myClass::myClass()
:id(internalCounter++)
{
}

顾名思义,原子int上的
操作符+++
后增量是原子的,因此它将是线程安全的。

您所说的“现在允许这样做”是什么意思@达菲莫:它看起来像是每个对象的唯一标识符,而不是引用计数。为什么会有这么多否决票?取消结束。因为不清楚你到底在问什么。除了在课堂结束时没有半结肠和潜在的链接错误,你所做的基本知识在C++中是合法的,即使不是你实际想要达到的解决方案。