使用静态 class 成员作为初始化列表中的参数

Using a static class member as a parameter in initialise list

我想要一个简单的 class 来表示具有唯一 ID 的对象。每个新对象都会获得一个比之前创建的对象更高的 ID。需要注意的重要一点是每个对象的 id 都是常量,所以我不得不使用初始化列表。出于某种原因,我收到有关未定义引用的错误:Undefined reference to Test::ID.

class Test
{
    const int m_id;
    static int ID;
public:
    Test() : m_id(ID++)
    {
        cout << "Created object with id: " << m_id << endl;
    }
};
  1. 这是为什么?
  2. 我该如何解决这个问题?
  3. 如何确保 ID 预初始化为 0,这样我就不会增加未初始化的变量?

您需要为一个翻译单元中的静态保留存储空间。然后你初始化它。所以你需要写

int Test::ID = 0;

在您的一个源文件中。

考虑将类型更改为 std::atomic<int>. 这样做会提高代码的线程安全性。