6 Stimmen

Gewerkschaftshack benötigt

Ich habe eine Struktur, die einen Scheitelpunkt darstellt. Es hat x, y und z Felder sowie mehrere andere. Vor kurzem kam ich zu dem Schluss, dass ich für bestimmte Funktionen auf die Koordinaten des Scheitelpunkts als Array zugreifen muss. Ich wollte den Code nicht mit temporären Variablen "verschmutzen" oder alle Stellen ändern, die wie folgt aussehen v.y hierzu v.coord[1] was weder schön noch elegant ist. Also habe ich über eine Vereinigung nachgedacht. Etwas wie dies sollte funktionieren:

struct {
  float x,y,z;
} Point;

struct {
    union {
        float coord[3];
        Point p;
    };
} Vertex;

Das ist gut, aber nicht perfekt. Die Punktklasse hat keinen Sinn, da zu sein. Ich möchte in der Lage sein, die y-Koordinate einfach durch Eingabe von v.y (und nicht v.p.y ).
Können Sie einen Hack vorschlagen, um dieses Problem zu lösen (oder mir sagen, dass dies nicht möglich ist)?

14voto

James McNellis Punkte 337231

Ein guter Ansatz in C++ ist die Verwendung von benannten Accessors, die Verweise auf die Elemente zurückgeben:

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];
};

Bei diesem Ansatz wird eine Point p; können Sie beides verwenden p[0] y p.X() um auf das erste Element der internen coords_ Array.

12voto

Rafid Punkte 17101

OK, das sollte für Sie funktionieren

struct {
    union {
        float coord[3];
        struct
        {
            float x,y,z;
        };
    };
} Vertex;

Dieser Code verbindet das Array mit der Struktur, so dass sie sich denselben Speicher teilen. Da die Struktur keinen Namen enthält, ist sie ohne Namen zugänglich, genau wie die Vereinigung selbst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X