static是如何使用ClassA::m_variable处理所有类对象的

How did static work with all class objects using ClassA::m_variable?

本文关键字:处理 对象 variable 何使用 ClassA static      更新时间:2023-10-16

我们最近发现了由此错误引起的项目问题:

namespace sim
{
class ClassA
{
private:
static std::list<uint16_t> m_variable;
}
std::list<uint16_t> ClassA::m_variable;
}

m_variable对于ClassA的所有实例都变为静态,而不仅仅是对于它的特定实例。

为什么会发生这种情况?

在您发表评论后,您想了解如何使用类的静态成员。

对于普通数据成员,该类的每个实例中都存在该成员的一个实例。OTOH静态数据成员只存在一次,并且在类的所有对象实例之间共享。

简单地说,类定义中静态成员的简单声明只是一个声明。由于一个定义规则,该对象还需要定义

在C++语言中,该定义通常出现在类定义之外,因此需要std::list<uint16_t> ClassA::m_variable;行。

该规则有一个例外,主要是对于可以在类定义中定义的静态const积分成员,前提是您只使用它们的值而不使用它们的地址(如果您想更进一步,请搜索One definition rule(。但这是一个相当高级的角落案例,所以如果你是初学者,请记住类的静态成员需要类定义之外的定义。