修改 C++ 中的静态成员变量
modify a static member variable in C++
我正在尝试使用静态成员变量定义一个类 Util,MAX_DIST,在以下意义上,
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++禁止非常量静态成员的类内初始化"错误)现在我无法在其他地方修改MAX_DIST,因为它现在只准备好了:
error: assignment of read-only variable ‘Util::MAX_DIST’
在互联网上搜索无果后,我找不到解决这个悖论的方法。有人可以帮助我吗?
把它放在你的Util.cpp
(或任何文件名)文件中:
double Util::MAX_DIST = 0;
静态变量需要初始化。
长答案,引用标准9.4.2 $2
:
静态数据成员在其类定义中的声明不是 定义,可能属于不符合 CV 标准的不完整类型 无效。静态数据成员的定义应出现在 包含成员的类定义的命名空间范围。在 命名空间范围内的定义,静态数据成员的名称 应使用 :: 运算符按其类名限定。这 静态数据成员定义中的初始值设定项表达式位于 其类的范围 (3.3.7)。
在第一种情况下,您尝试从非静态上下文中初始化静态变量,即从构造函数中初始化。你是对的,这是错误的。
在第二种情况下,您不希望变量是常量变量。相反,您需要在类外部声明它,使用如下语句:
double Util::MAX_DIST = 400;
但是,如果我在其定义上初始化MAX_DIST
你混淆了定义和声明。您正在尝试在后者中进行初始化 - C++禁止这样做。其他答案向您展示了定义的外观:它必须在类声明之外,并且位于其自己的编译单元中(否则,当您尝试在多个源文件中包含标头时,您将违反一个定义规则)。
关于为什么原始代码不起作用的一句话:您尝试将初始化放入构造函数的初始化器列表中。但是,为每个实例调用此构造函数。即使编译了该代码,它也始终会重置您的静态变量 - 而不是您想要的。
- C++:是否可以使用非静态成员变量模板?
- 如何在复杂继承中访问静态成员变量
- 静态成员变量不会由 gettext 转换
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- C++ lambda - 捕获静态成员变量
- 多线程处理中的静态成员变量
- 纯标头库中静态成员变量的正确设置器和 getter
- 如何从具有专用化的类模板定义静态成员变量?
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 声明和定义类静态成员变量不会导致多重声明,这是为什么?
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 类中的静态成员变量和C++中的全局变量有什么区别?
- C++ 静态成员变量 - 文件之间的访问
- 如何在运行时使用静态成员函数初始化静态成员变量
- 模板类中嵌套类的C 静态成员变量
- 如何检查静态成员变量模板?
- 重载运算符和静态成员变量的行为
- 类的静态成员变量(受保护)的作用域
- gcc 和 clang 中 constexpr 静态成员变量的链接器错误
- dll 中静态成员变量的生存期