我遇到一个奇怪的问题,我在初始化类后无法修改类的一个静态成员。这是我的代码:
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;
}
如果我在my_values.cpp
中注释第5行,那么文件编译正常。但如果我不这样做,我得到的错误是
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
的对象。但为什么会这样呢?
答案 0 :(得分:4)
问题不在于您不能修改对象。问题是你放置了这个:
Bar::weird_class_obj.set_weird_value(100.0f);
可执行语句,进入命名空间范围。那是不允许的。
如果WeirdClass
的c是非常奇怪的,你可能没有在其中设置值,但是类不是那么奇怪以至于禁止复制/移动,你可以使用以下技巧:
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。如果你出于某种原因无法做到这一点,那么一个命名的自由函数也可以用于同样的目的。