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

c++ class returning pointer to member to be used as array

本文关键字:数组 成员 指针 返回 C++      更新时间:2023-10-16
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下正确工作,但我有一种感觉,这是非常可怕的错误。

你的感觉是正确的。

但有什么意义呢?为什么你不只有一个数组成员而不是 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?你的班级似乎重新发明了轮子。

作为一般规则,您应该禁止自己返回私有数据成员的指针/非常量引用。

封装的基本目的是对象(即数据成员(的状态只能通过为该类定义的成员函数来改变。通过将指针返回到数据成员,您正在创建另一条更改状态的路径,这绝对不是一个好主意。

如果效率是主要关注点,那么您可以返回 const 引用。