我有一个表示顶点的结构。它有x,y和z字段以及其他几个字段。最近我得出结论,对于某些功能,我将需要以数组的形式访问顶点的坐标。我不想用临时变量“污染”代码,或者将所有看起来像这个v.y
的地方改为这个v.coord[1]
,这不好也不优雅。所以我考虑使用工会。这样的事情应该有效:
struct {
float x,y,z;
} Point;
struct {
union {
float coord[3];
Point p;
};
} Vertex;
这很好,但并不完美。点类没有意义。我希望只需输入v.y
(而不是v.p.y
)即可访问y坐标。
你能建议一个黑客来解决这个问题(或告诉我这是不可能的)吗?
答案 0 :(得分:14)
一个好的C ++方法是使用返回元素引用的命名访问器:
class Point {
public:
float& operator[](int x) { assert(x <= 2); return coords_[x]; }
float operator[](int x) const { assert(x <= 2); return coords_[x]; }
float& X() { return coords_[0]; }
float X() const { return coords_[0]; }
float& Y() { return coords_[1]; }
float Y() const { return coords_[1]; }
float& Z() { return coords_[2]; }
float Z() const { return coords_[2]; }
private:
float coords_[3];
};
使用此方法,在Point p;
的情况下,您可以同时使用p[0]
和p.X()
来访问内部coords_
数组的初始元素。
答案 1 :(得分:12)
好的,这应该对你有用
struct {
union {
float coord[3];
struct
{
float x,y,z;
};
};
} Vertex;
这段代码的作用是将数组与结构联合起来,因此它们共享相同的内存。由于结构不包含名称,因此无需名称即可访问,就像联合本身一样。