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)
在网上搜索无效之后,我无法找到解决这个悖论的方法.有人可以帮我吗?
把它放在你的Util.cpp(或任何文件名)文件中:
double Util::MAX_DIST = 0;
Run Code Online (Sandbox Code Playgroud)
需要初始化静态变量.
答案很长,引用标准9.4.2 $2:
静态数据成员在其类定义中的声明不是定义,除了cv-qualified void之外可能是不完整的类型.静态数据成员的定义应出现在包含成员类定义的命名空间范围内.在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定.静态数据成员定义中的初始化表达式在其类的范围内(3.3.7).
\n\n\n但是,如果我在定义时初始化 MAX_DIST
\n
你\xe2\x80\x99混淆了定义和 声明。您试图在后者中初始化 \xe2\x80\x93 C++ 禁止这样做。其他答案已经向您展示了定义的样子:它必须位于类声明之外,并且在其自己的编译单元中(否则当您尝试将标头包含在多个源中时,您\xe2\x80\x99将违反单一定义规则文件)。
\n\n关于为什么原始代码不起作用的一句话:您尝试将初始化放入构造函数的初始化列表中。但是,每个实例都会调用此构造函数。即使该代码已编译,它总是会重置您的静态变量 \xe2\x80\x93 而不是您想要的。
\n