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

时间:2012-11-18 18:00:46

标签: c++ static-members

我正在尝试使用静态成员变量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’

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

3 个答案:

答案 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 ++禁止这样做。其他答案向您展示了定义的外观:它必须是外部类声明,并且在它自己的编译单元中(否则你将违反一个定义)尝试在多个源文件中包含标题时的规则。)

关于原始代码无效的原因:您尝试将初始化放入构造函数的初始化列表中。但是,此构造函数对于每个实例都称为 。即使编译了这段代码,它也会一直重置你的静态变量 - 而不是你想要的。