我正在尝试使用静态成员变量MAX_DIST定义类Util,在下面的意义上,
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 ++禁止非const静态成员的类内初始化”错误) 现在我无法在其他地方修改MAX_DIST,因为它现在只能就绪:
error: assignment of read-only variable ‘Util::MAX_DIST’
在互联网上搜索无效之后,我无法找到解决这个悖论的方法。有人可以帮助我吗?
答案 0 :(得分:6)
将它放在Util.cpp
(或文件名为)文件中:
double Util::MAX_DIST = 0;
需要初始化静态变量。
答案很长,引用标准9.4.2 $2
:
在其类定义中声明静态数据成员不是 定义,除了cv-qualified之外,可能是不完整的类型 无效。静态数据成员的定义应出现在 命名空间范围包含成员的类定义。在里面 命名空间范围内的定义,静态数据成员的名称 应使用::运算符通过其类名限定。该 静态数据成员定义中的初始化表达式 同类的范围(3.3.7)。
答案 1 :(得分:3)
在第一种情况下,您尝试从非静态上下文中初始化静态变量,即从构造函数中初始化。你是对的,这是错的。
在第二种情况下,您不希望变量为const。相反,您需要使用如下语句在类之外声明它:
double Util::MAX_DIST = 400;
答案 2 :(得分:2)
但是,如果我在其定义中初始化MAX_DIST
您的定义和声明令人困惑。你试图在后者中初始化--C ++禁止这样做。其他答案向您展示了定义的外观:它必须是外部类声明,并且在它自己的编译单元中(否则你将违反一个定义)尝试在多个源文件中包含标题时的规则。)
关于原始代码无效的原因:您尝试将初始化放入构造函数的初始化列表中。但是,此构造函数对于每个实例都称为 。即使编译了这段代码,它也会一直重置你的静态变量 - 而不是你想要的。