我有一个表示顶点的结构.它有x,y和z字段以及其他几个字段.最近我得出结论,对于某些功能,我需要以数组的形式访问顶点的坐标.我不想用临时变量"污染"代码或者将所有看起来像这样的地方v.y改为v.coord[1]不好或不优雅.所以我考虑使用工会.这样的事情应该有效:
struct {
float x,y,z;
} Point;
struct {
union {
float coord[3];
Point p;
};
} Vertex;
Run Code Online (Sandbox Code Playgroud)
这很好,但并不完美.点类没有意义.我希望能够通过键入v.y(而不是v.p.y)来访问y坐标.
你能建议一个黑客来解决这个问题(或者告诉我这是不可能的)?
Jam*_*lis 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];
};
Run Code Online (Sandbox Code Playgroud)
使用这种方法,给定a Point p;,您可以使用p[0]和p.X()访问内部coords_数组的初始元素.
Raf*_*fid 12
好的,这应该对你有用
struct {
union {
float coord[3];
struct
{
float x,y,z;
};
};
} Vertex;
Run Code Online (Sandbox Code Playgroud)
这段代码的作用是将数组与结构联合起来,因此它们共享相同的内存.由于结构不包含名称,因此可以在没有名称的情况下访问它,就像union本身一样.