联盟黑客需要

时间:2010-12-24 19:11:41

标签: c++ c

我有一个表示顶点的结构。它有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坐标。
你能建议一个黑客来解决这个问题(或告诉我这是不可能的)吗?

2 个答案:

答案 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;

这段代码的作用是将数组与结构联合起来,因此它们共享相同的内存。由于结构不包含名称,因此无需名称即可访问,就像联合本身一样。