初始化后修改静态成员
Modifying Static Member after Initialization
我遇到了一个奇怪的问题,初始化类后我无法修改类的静态成员之一。这是我的代码:
my_values.hpp
#include "weird_class.hpp"
namespace foo {
class Bar {
public:
static WeirdClass weird_class_obj;
};
my_values.cpp
#include "weird_class.hpp"
#include "my_values.hpp"
namespace foo {
WeirdClass Bar::weird_class_obj = WeirdClass(1.0f, 0.0f, 1.0f, 100.0f);
Bar::weird_class_obj.set_weird_value(100.0f);
}
weird_class.hpp
#ifndef WEIRD_CLASS_H
#define WEIRD_CLASS_H
class WeirdClass {
public:
WeirdClass(float, float, float, float);
void set_weird_value(float);
private:
float weird_value;
};
#endif
weird_class.cpp
#include "weird_class.hpp"
void WeirdClass::set_weird_value(float weirdValue) {
weird_value = weirdValue;
}
如果我注释掉 5 行my_values.cpp
文件编译正常。但如果我不这样做,我得到的错误是
error: no type named 'weird_class_obj' in 'foo::Bar' Bar::weird_class_obj.set_weird_value(100.0f);
^
error: cannot use dot operator on a type Bar::weird_class_obj.set_weird_value(100.0f);
^
我的猜测是,weird_class_obj
以某种方式被视为一种类型,而不是类WeirdClass
的对象。但为什么会这样呢?
问题不在于您不能修改对象。问题是你放置了这个:
Bar::weird_class_obj.set_weird_value(100.0f);
一个可执行语句,进入命名空间范围。这是不允许的。
如果 WeirdClass
的 c'tor 很奇怪,以至于您可能不会在其中设置值,但该类并没有奇怪到不允许复制/移动,您可以使用以下技巧:
WeirdClass Bar::weird_class_obj = []() {
WeirdClass obj(1.0f, 0.0f, 1.0f, 100.0f);
obj.set_weird_value(100.0f);
return obj;
}();
以上在 JavaScript 世界中被称为 IIFE。如果您由于某种原因无法做到这一点,那么命名的 free 函数也可以用于相同的目的。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 当push_back到向量中时,我是否需要复制构造函数来修改静态成员
- 初始化后修改静态成员
- 如果我创建一个修改值的迭代器,静态成员"reference"应该是什么类型?
- 修改 C++ 中的静态成员变量
- 既然静态成员函数不能修改非静态成员变量,为什么还要使用它呢?
- 当我们可以使用普通函数修改静态数据成员时,静态成员函数的需求是什么?
- 是否可以在constexpr构造函数中修改非静态成员变量(c++ 14)
- 为什么这个const成员函数要修改静态成员数据?