由非const类

时间:2017-06-07 15:44:43

标签: c++ c++03 const-correctness

我希望使用面向类的设计来高效,干净地处理嵌入式平台上的数据。我不应该在堆栈上创建新对象(或者至少是非常经济的)所以我打算将我的数据作为对辅助类的引用传递并在其中进行操作(也是为了实现正确的封装)。

以下代码是我所面临问题的一​​个非常简单的示例。

#include "Vector.h"

void DoSomething(float* a1, const float* a2)
{
  // some code

  Vector v1(a1[0], a1[1], a1[2]);
  Vector v2(a2[0], a2[1], a2[2]);
  v1.MakeEqual(v2);

  // more code
}

int main()
{
  float x1[3] = { 0, 0, 0 };
  float x2[3] = { 1, 1, 1 };
  DoSomething(x1, x2);
  return 0;
}

Vector - 类在头文件中定义:

#pragma once
class Vector
{
public:
  Vector(float& _x, float& _y, float& _z) :x(_x), y(_y), z(_z)
  {}

  Vector(const float& _x, const float& _y, const float& _z) 
      :x(const_cast<float&>(_x)), y(const_cast<float&>(_y)), z(const_cast<float&>(_z)) //works, but looks not good
  {}

  ~Vector(){};

  void MakeEqual(const Vector& other)
  {
    x = other.x;
    y = other.y;
    z = other.z;
  }

private:
  float& x;
  float& y;
  float& z;
};

我的数据在extern(main - function)的某处定义,然后作为指向函数DoSomething的指针传递。在这个函数内部,矢量对象被包裹在数据周围,以帮助做一些矢量典型的东西(旋转,交叉产品等......)。现在我想要const-correct并传递不打算更改为const的数据,但是当创建vector v2时,我让编译器抱怨他cannot convert argument 1 from 'const float' to 'float &'。我明白他想说什么,但我怎么能解决这个问题呢?向量方法只有在我在向量上使用它时才有意义,但向量v2的构造函数不知道我实际上没有操作v2的数据。

在第二个构造函数中使用const_cast的代码中显示了解决此问题的一种方法,但我觉得这不是好的样式,因为我正在丢弃我的合法const数据。另一种方法是定义第二个类ConstVector,但这看起来也很奇怪。

我必须提到,由于编译器的限制,我受C++03标准的约束,所以不幸的是我无法使用过于现代的语言功能。另外stl - 容器(可能)不可用,因为我无法控制分配内存的方式,时间和位置。

1 个答案:

答案 0 :(得分:0)

你有:

Vector(float& _x, float& _y, float& _z) :x(_x), y(_y), z(_z)

这不行。例如,您无法使用:

Vector v1(0, 0, 0);

此外,您无法使用

Vector v1(a1[0], a1[1], a1[2]);

因为a1[0]评估为const float&,而不是float&

设计糟糕的界面。将参数更改为简单值:

Vector(float _x, float _y, float _z) :x(_x), y(_y), z(_z)