我可以修改const成员变量吗?

时间:2014-01-30 20:02:40

标签: c++ const

我知道,我知道。这个问题只是尖叫着“你不应该处于那种境地!”但是听我说......

我有一个游戏引擎,可以在一个线程中执行更新,而在另一个线程中执行渲染。渲染器希望读取前一帧中的数据,而更新将更新数据,就像下一帧一样。

所以,为了解决这个问题,我有一个POD结构,mutable_data,即对象中可以改变的一切(速度,位置等等),我在对象内部有两个实例,一个是const,另一个是另一个不。在游戏循环的一次迭代结束时,非const数据将是最新的数据对象,然后我想在const实例上复制它,以便它们现在相等并准备好进行下一次迭代。 / p>

这可能吗?

我已经起草了一个示例程序,希望能够明确我的意思:

#include <iostream>

struct mutable_data
{
  int i = 1;
  bool j = true;
  char k = 'a';
};

struct my_data
{
  my_data() : constData() {} 

  int i() const { return constData.i; }
  bool j() const { return constData.j; }
  char k() const { return constData.k; }

  void set_i(int i) { data.i = i; }
  void set_j(bool j) { data.j = j; }
  void set_k(char k) { data.k = k; }

  void update() { constData = data; }

private:
  mutable_data const constData;
  mutable_data data;
};

int main()
{
  my_data d;
  std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl;

  d.set_i(10);
  d.set_j(false);
  d.set_k('z');

  std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl;
  std::cout << "===============" << std::endl;

  d.update();

  std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl;
}

2 个答案:

答案 0 :(得分:4)

为两个数据结构使用访问器,一个用于当前(const),另一个用于即将到来的数据结构。

mutable_data & currentData() { return *currentPtr; }
const mutable_data & upcomingData() { return *upcomingPtr; }

void update() { std::swap(currentPtr, upcomingPtr); }

答案 1 :(得分:1)

这是一个非常有趣的问题。我认为你得到的是data race在适合并发的条件下实现的问题。

正如单独question中所讨论的,操纵您想要成为const的内容的一种可能方法是将变量修改为mutable

当然,为了实现这一目的,必须重新设计结构。使用const方法初始化所述变量将使您能够锁定所需的值。

除了关键字mutable之外,您还应考虑使用const_cast重新设定变量。