初始化后修改静态成员

时间:2017-11-09 11:14:26

标签: c++

我遇到一个奇怪的问题,我在初始化类后无法修改类的一个静态成员。这是我的代码:

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的对象。但为什么会这样呢?

1 个答案:

答案 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。如果你出于某种原因无法做到这一点,那么一个命名的自由函数也可以用于同样的目的。