6

我试图用静态成员变量 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’

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

4

3 回答 3

8

将其放入您的Util.cpp(或任何文件名)文件中:

double Util::MAX_DIST = 0;

静态变量需要初始化。

长答案,引用标准9.4.2 $2

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

于 2012-11-18T18:02:50.070 回答
3

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

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

double Util::MAX_DIST = 400;
于 2012-11-18T18:03:26.747 回答
2

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

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

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

于 2012-11-18T18:04:35.730 回答