2017-03-11 4 views
0

Ich mache eine einfache Klasse für Objekte vom Typ Vector3D. Der folgende Code wird kompiliert und perfekt ausgeführt.Klammeroperator als Elementfunktion überladen

class Vector3D { 
    float x, y, z; 
public: 
    Vector3D() = default; 
    Vector3D(float a, float b, float c) : x(a), y(b), z(c) {}; 
    float& operator [](int i) { 
     return (&x)[i]; 
    } 
    const float& operator [](int i) const { 
     return (&x)[i]; 
    } 
} 

int main(int argc, char ** argv){ 
    Vector3D myVec(1,2,3); 
    printf("Value of y: %d\n", myVec[1]); 
} 

aber wenn ich entfernen Sie den Adressoperator (&) Ich erhalte eine Fehlermeldung, und der Code wird nicht funktionieren. Warum ist die (&) notwendig? d. h .:

return (x)[i]; // will not compile "expression must have pointer-to-object type" 
return (&x)[i]; // all good here 

Auch ich habe Probleme zu verstehen, wie das überhaupt funktioniert. Wie kann es sein, dass die Funktion den i-ten Float zurückgibt, werden Member-Variablen zusammenhängend im Speicher gespeichert (wie Arrays)?

Antwort

2

Die Art, wie Sie das tun, ist so schwierig, und das ist undefined Verhalten.

Es gibt keine Garantie für struct Mitglied Layout, aber die meiste Zeit werden die Mitglieder auf Speicher platziert, wie:

x---y---z--- (4 bytes each) 
x[0] 
    x[1] 
     x[2] 

Also aus diesem Grund wird der Code (vergessen, das ist nicht ein definiertes Verhalten) Arbeits .

Ihr Code ist nicht die Überprüfung der Grenzen wie auch immer, so betrachten:

  1. es in einen Schalter umzuwandeln.
  2. Machen Sie Ihr Mitglied zu einem Array wie float x[3].
Verwandte Themen