Wie überlade ich einen unären Minus-Operator in C ++?

74

Ich implementiere eine Vektorklasse und muss ein Gegenteil von einem Vektor erhalten. Ist es möglich, diese Methode durch Operatorüberladung zu definieren?

Folgendes meine ich:

Vector2f vector1 = -vector2;

Ich möchte, dass dieser Operator Folgendes erreicht:

Vector2f& oppositeVector(const Vector2f &_vector)
{
 x = -_vector.getX();
 y = -_vector.getY();

 return *this;
}

Vielen Dank.

Ilya Suzdalnitski
quelle
6
Stilkommentar: Stellen Sie Ihren Variablen kein ' ' voran. Dieser Stil ist für die Implementierung (Compiler) reserviert und es können Konflikte auftreten. Außerdem erkennen Leser meine Variablen aufgrund des Präfixes ' ' ungewollt als Implementierungsvariablen . Sie müssen '_' nicht innerhalb von Funktionen verwenden. Sie werden ohne sie lesbar sein.
Thomas Matthews
4
Zwei Unterstriche sind für die Implementierung reserviert, nicht nur einer.
el.pescado
Ich glaube, dass es _MACROs und __identifiers sind.
Welpe
2
Bitte sagen Sie mir, warum Sie .getX()und .getY()auf Ihrem einfachen
Vektortyp
1
Um präzise : Identifikatoren mit zwei nachfolgenden Unterstrichen überall ist reserviert - immer ausgehend Identifikatoren mit einem Unterstrich von einem captital nachgestellten Buchstaben sind immer reserviert, auch jede Kennung mit einem Unterstrich beginnen reserviert im globalen Namensraum .
Aconcagua

Antworten:

127

Ja, aber Sie geben keinen Parameter an:

class Vector {
   ...
   Vector operator-()  {
     // your code here
   }
};

Beachten Sie, dass Sie * dies nicht zurückgeben sollten. Der unäre Operator muss einen brandneuen Vektorwert erstellen und darf nicht das Element ändern, auf das er angewendet wird. Daher möchte Ihr Code möglicherweise ungefähr so ​​aussehen:

class Vector {
   ...
   Vector operator-() const {
      Vector v;
      v.x = -x;
      v.y = -y;
      return v;
   }
};

quelle
8
@Kornel Kisielewicz: Nannte es „die einzige richtige Lösung“ ist irreführend. Unary -kann auch durch eine eigenständige Funktion überlastet werden, die die Implementierung von OP genau widerspiegeln würde oppositeVector.
Am
28

Es ist

Vector2f operator-(const Vector2f& in) {
   return Vector2f(-in.x,-in.y);
}

Kann innerhalb der Klasse oder außerhalb sein. Mein Beispiel befindet sich im Namespace-Bereich.

Alexander Gessler
quelle
+1, um zu erkennen, dass Sie eine neue Vector2f-Instanz zurückgeben müssen, keine Referenz auf das aktuelle Objekt.
Mike Seplowitz
1
Dies ist die Implementierung eines binären Operators. Unary hat keinen Parameter, wie @anon sagte.
Herr Shunz
6
Nein, es ist ein unärer Operator. Es wird ein Vector2fas-Parameter verwendet, da er eher im Namespace als im Klassenbereich definiert ist. Meine Antwort ist richtig.
Alexander Gessler
8
Siehe auch 13.5.1 - 'Ein unärer Präfixoperator muss durch eine nicht statische Elementfunktion (9.3) ohne Parameter oder eine Nichtelementfunktion mit einem Parameter implementiert werden'.
Alexander Gessler
2
@shunz es ist ein unärer Operator. Beachten Sie, dass es sich um einen Namespace-Bereich handelt, nicht um einen Klassenbereich.
xis