class vector3
{
private:
float x;
float y;
float z;
public:
vector3( float x, float y, float z ) : x(x), y(y), z(z) {}
// returning pointer to first member to use it as array.
// assumes that data layout is sizeof(float) by sizeof(float) by sizeof(float)
// and their order is not changed.
float* ptr() { return &x; }
// implicit casting version of ptr()
operator float*() { return ptr(); }
};
...
vector3 v(1,2,3);
float x = v[0];
float y = v[1];
float z = v[2];
它在任何平台和任何编译器设置上都有效吗? 我发现这在visual studio 2013正常工作, 但我感觉这是非常可怕的错误。
答案 0 :(得分:1)
作为一般规则,您应该禁止自己返回私有数据成员的指针/非const引用。
封装的基本目的是对象状态(即数据成员)只能通过为该类定义的成员函数进行更改。通过返回指向数据成员的指针,您正在创建另一个更改状态的路径,这绝对不是一个好主意
如果效率是主要问题,那么你可以返回const引用。
答案 1 :(得分:1)
你的感觉是正确的。
但重点是什么?为什么你不是只有一个阵列成员而不是3个float
个成员?
class vector3
{
private:
std::array<float, 3> data;
public:
vector3( float x, float y, float z ) : data( {x, y, z } ) {}
float* ptr() { return data.data(); }
operator float*() { return ptr(); }
};
这使用C ++ 11,但您可以使用C ++ 03实现相同的功能:
class vector3
{
private:
float data[3];
public:
vector3( float x, float y, float z )
{
data[0] = x;
data[1] = y;
data[2] = z;
}
float* ptr() { return data; }
operator float*() { return ptr(); }
};
当然,最大的问题是:为什么不直接使用std::vector
或std::array
?你的班级似乎重新发明了轮子。