修改 C++ 中的静态成员变量

modify a static member variable in C++

本文关键字:静态成员 变量 C++ 修改      更新时间:2023-10-16

我正在尝试使用静态成员变量定义一个类 Util,MAX_DIST,在以下意义上,

class Util{
 public:
    static double MAX_DIST;
    Util():MAX_DIST(400.0){}
};

并能够在其他类中更新它,例如

Util::MAX_DIST = 387.98;

这给了我一个错误:

‘double Util::MAX_DIST’ is a static data member; it can only be initialized at its definition

但是,如果我在其定义上初始化MAX_DIST,例如

class Util{
 public:
    static const double MAX_DIST = 400;
    Util();
};

(我必须按照编译器的指示添加"const",否则我会得到"ISO C++禁止非常量静态成员的类内初始化"错误)现在我无法在其他地方修改MAX_DIST,因为它现在只准备好了:

error: assignment of read-only variable ‘Util::MAX_DIST’

在互联网上搜索无果后,我找不到解决这个悖论的方法。有人可以帮助我吗?

把它放在你的Util.cpp(或任何文件名)文件中:

double Util::MAX_DIST = 0;

静态变量需要初始化。

长答案,引用标准9.4.2 $2

静态数据成员在其类定义中的声明不是 定义,可能属于不符合 CV 标准的不完整类型 无效。静态数据成员的定义应出现在 包含成员的类定义的命名空间范围。在 命名空间范围内的定义,静态数据成员的名称 应使用 :: 运算符按其类名限定。这 静态数据成员定义中的初始值设定项表达式位于 其类的范围 (3.3.7)。

在第一种情况下,您尝试从非静态上下文中初始化静态变量,即从构造函数中初始化。你是对的,这是错误的。

在第二种情况下,您不希望变量是常量变量。相反,您需要在类外部声明它,使用如下语句:

double Util::MAX_DIST = 400;

但是,如果我在其定义上初始化MAX_DIST

你混淆了定义和声明。您正在尝试在后者中进行初始化 - C++禁止这样做。其他答案向您展示了定义的外观:它必须在类声明之外,并且位于其自己的编译单元中(否则,当您尝试在多个源文件中包含标头时,您将违反一个定义规则)。

关于为什么原始代码不起作用的一句话:您尝试将初始化放入构造函数的初始化器列表中。但是,为每个实例调用此构造函数。即使编译了该代码,它也始终会重置您的静态变量 - 而不是您想要的。