c ++类返回指向要用作数组的成员的指针

时间:2014-10-12 08:19:05

标签: c++

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正常工作, 但我感觉这是非常可怕的错误。

2 个答案:

答案 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::vectorstd::array?你的班级似乎重新发明了轮子。