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

yan*_*ang 5 c++ static-members

我试图用一个静态成员变量MAX_DIST定义一个类Util,在下面的意义上,

class Util{

 public:
    static double MAX_DIST;
    Util():MAX_DIST(400.0){}
};
Run Code Online (Sandbox Code Playgroud)

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

Util::MAX_DIST = 387.98;
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

‘double Util::MAX_DIST’ is a static data member; it can only be initialized at its definition
Run Code Online (Sandbox Code Playgroud)

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

class Util{

 public:
    static const double MAX_DIST = 400;
    Util();
};
Run Code Online (Sandbox Code Playgroud)

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

error: assignment of read-only variable ‘Util::MAX_DIST’
Run Code Online (Sandbox Code Playgroud)

在网上搜索无效之后,我无法找到解决这个悖论的方法.有人可以帮我吗?

Vin*_*Pii 6

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

double Util::MAX_DIST = 0;
Run Code Online (Sandbox Code Playgroud)

需要初始化静态变量.

答案很长,引用标准9.4.2 $2:

静态数据成员在其类定义中的声明不是定义,除了cv-qualified void之外可能是不完整的类型.静态数据成员的定义应出现在包含成员类定义的命名空间范围内.在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定.静态数据成员定义中的初始化表达式在其类的范围内(3.3.7).


Kon*_*lph 2

\n

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

\n
\n\n

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

\n\n

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

\n