C++ 类返回指向要用作数组的成员的指针
c++ class returning pointer to member to be used as array
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::vector
或std::array
?你的班级似乎重新发明了轮子。
作为一般规则,您应该禁止自己返回私有数据成员的指针/非常量引用。
封装的基本目的是对象(即数据成员(的状态只能通过为该类定义的成员函数来改变。通过将指针返回到数据成员,您正在创建另一条更改状态的路径,这绝对不是一个好主意。
如果效率是主要关注点,那么您可以返回 const 引用。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- C++内联数组成员统一初始化
- 有没有办法把字符串数组成员放在".structurevariable"前面?
- 将初始化列表传递给 C++ 中的数组成员
- 具有灵活数组成员的结构的大小
- 初始化固定的 C 数组成员结构
- 带有布尔数组成员的 C++ 结构.如何在主代码中使用
- 我如何通过构造函数大小私人std ::数组成员
- 通过两个下标访问数组成员
- size_t结构非数组成员崩溃的强制转换
- 删除数组成员的更好方法是什么?
- 从C 到C#调用INT []显示随机大数字,而不是原始数组成员
- 在C 中的数组初始化期间使用数组成员
- 友元函数将内存分配给数组成员是否有任何限制?
- 从结构传递数组成员会导致访问读取冲突
- 为什么 const char 数组成员的初始化在构造函数初始值设定项中不兼容
- 如何在 lambda 中访问数组成员
- 将整数值分配为variadic模板列表到静态const std ::数组成员