Frage

Ich weiß, dass es eine gute Idee, so viel von der Schnittstelle einer Klasse Dritt Nicht-Freundes wie möglich zu machen, und ich habe gerade realisiert, dass für meine 3D-Vektor-Klasse, ‚Vector3‘, ich bewegen kann + =, -. = usw. Operatoren aus der Klasse, so dass nur Konstrukteuren und den Kopierzuweisungsoperator

Die Frage ist: Was sollte diesen Operator aussehen? Ich habe kanonische Formen der viele andere Betreiber gesehen und haben ihren Rat befolgt, aber ich habe nicht kanonischen Formen dieser Operatoren gesehen. Ich habe gegeben, was ich denke, es sollte unten sein.

Die sekundäre Frage ist: Was sind diese Operatoren auch genannt? Arithmetic Zuweisungsoperator?

Der (relevante) Code vor:

class Vector3 {
public:
    Vector3& operator+=(const Vector3& rhs);
    float x, y, z;
};

Vector3& Vector3::operator+=(const Vector3 &rhs) {
    x += rhs.x;
    y += rhs.y;
    z += rhs.z;

    return *this;
}

Was ich geändert habe es so weit:

class Vector3 {
public:
    float x, y, z;
};

Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
    lhs.x += rhs.x;
    lhs.y += rhs.y;
    lhs.z += rhs.z;

    return lhs;
}
War es hilfreich?

Lösung

Was haben Sie sieht gut aus für mich.

Übrigens, wenn Sie an den Operator + kommen, ist es üblich, dass in Bezug auf die + = umzusetzen. (Erstellen einer Kopie von LHS und dann LHS + = rhs rufen und das Ergebnis zurück)

Sie wissen nicht, wenn Sie bereits von diesem Trick bewusst sind, aber da Sie besorgt über kanonische Weise sind diese Operatoren zu implementieren, kann es nicht schaden zu erwähnen. :)

Andere Tipps

Was haben Sie sieht gut aus.

Der einfachste Weg, um darüber nachzudenken, intuitiv, um darüber nachzudenken, was Sie möchten, dass Code aussehen, wenn Sie es schreiben. Wenn in diesem Fall können Sie schreiben

Vector v, w;

v += w;
w += v;

und so weiter, Sie sind auf dem richtigen Weg.

Es gibt viele gute Faustregeln zu helfen; finden Sie unter dieser Eintrag in der C ++ FAQ für viele auf sie.

würde ich nicht sagen „wie viel von der Schnittstelle wie möglich“. Es gibt nicht viel, indem sie operator+= gewonnen werden, operator-= usw. ein nicht-Freund nicht-Mitglied.

Einige Leute ziehen es jede Funktion möglich ein Nicht-Mitglied nicht-friend-Funktion, um die Versuchung mit privaten Membervariablen zu widerstehen. Aber Sie sind ein Erwachsener: Sie haben die Funktion als öffentliches Mitglied schreiben kann, und nicht die privaten Membervariablen verwenden. Ich ziehe es zu wissen, dass die Funktion der Klasse gebunden ist, und macht es ein öffentliches Mitglied macht es explizit.

Abgesehen beachten Sie:
Ich persönlich finde, dass es oft in Ordnung ist, die privaten Mitglieder statt öffentlicher Accessoren zu verwenden (ich weiß - ich werde in der Hölle brennen). Nicht immer! - aber oft
. In der Tat gibt es einige Fälle, in denen Sie nicht den Schalter auf öffentliche Accessoren in einer Art und Weise von Minuten machen können, wenn Sie sich entscheiden, Sie es brauchen. Aber ich erkenne es ist nicht eine populäre Ansicht, und ich bitte nicht Leute diese Philosophie zu folgen.

Es gibt konkrete Gründe zu machen certaint Funktionen und Operatoren "Nicht-Freund, Nicht-Mitglied". Zum Beispiel operator << (), wenn sie als „Strom-Ausgabe-Operator“ verwendet nicht ein Mitglied gemacht werden, da Sie die LHS-Klasse ändern müßten (der Strom).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top