我希望使用面向类的设计来高效,干净地处理嵌入式平台上的数据。我不应该在堆栈上创建新对象(或者至少是非常经济的)所以我打算将我的数据作为对辅助类的引用传递并在其中进行操作(也是为了实现正确的封装)。
以下代码是我所面临问题的一个非常简单的示例。
#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
- 容器(可能)不可用,因为我无法控制分配内存的方式,时间和位置。
答案 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)