friend-operator == oder << Wann sollte ich es verwenden?
Spüre ich, dass ich ein bisschen ein Loch in mein Verständnis von der friend
Stichwort.
Ich habe eine Klasse presentation
. Ich benutze es in meinem code zwei Variablen present1
und present2
, die ich vergleichen mit ==
:
if(present1==present2)
Hier ist, wie ich die Betreiber ==
(in class presentation
):
bool operator==(const presentation& p) const;
Jedoch wurde mir gesagt, dass mit friend
und definieren Sie außerhalb der Klasse ist besser:
friend bool operator==(presentation&, presentation&);
Warum? Was ist der Unterschied zwischen den beiden?
- -1 unvollständig und bot verständlich
- Für mich ist es absolut nachvollziehbar. Sollte der operator== eine friend-Funktion außerhalb einer Klasse oder einer definiert innerhalb der Klasse?
- Ein bot kann die Frage nachvollziehen? >_>
- Ich denke, die unvollständig, bezieht sich auf seine Erklärung, warum er bekam eine -1.
- Ich verdeutlichte Sie Ihre Frage, denke ich-könnten Sie überprüfen und sicherstellen, dass ich es richtig? (Auch, Sie wollen un-akzeptieren Sie die Antwort, die Sie gewählt haben, wenn es nicht die Antwort auf Ihre Frage.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im ersten Fall, Ihre Funktion
operator==
ist ein nicht-statisches Klassenattribut. Es hat daher Zugriff auf private und geschützte member-Variablen.Im zweiten Fall ist der Betreiber extern deklariert, es sollte daher definiert werden als ein Freund der Klasse wird der Zugriff auf die member-Variablen.
Ihre Lösung funktioniert, aber es ist weniger leistungsfähig als die
friend
Ansatz.Wenn eine Klasse deklariert eine Funktion oder eine andere Klasse als
friend
es bedeutet, dass friend-Funktion oder Klasse haben Zugriff auf das deklarieren der Klasse' private-und protected-Elemente. Es ist, als wenn die deklarierte Einheit war ein Mitglied der Klasse deklarieren.Wenn Sie definieren
operator==()
als member-Funktion dann genauso wie mit derfriend
Fall die member-Funktion hat vollen Zugriff auf die Klasse' Mitglieder. Aber da es ein member-Funktion es gibt einen einzigen parameter, der erste parameter ist stillschweigend seinthis
: ein Objekt vom Typpresentation
(oder einen Abkömmling davon). Wenn, jedoch, Sie definieren die Funktion als nicht-Mitglied können Sie angeben, beide Parameter, und dies wird Ihnen die Flexibilität der Vergleich von zwei Typen, die Umwandlung in einepresentation
mit, die gleiche Funktion.Beispiel:
Schließlich stellt sich die Frage, "warum die
friend
Erklärung?". Wenn dieoperator==()
Funktion nicht benötigen Zugriff auf private member vonpresentation
dann in der Tat die beste Lösung ist, um es einem nicht-Mitglied, nicht-friend-Funktion. In anderen Worten, geben Sie nicht eine Funktion die Zugriffsrechte, die nicht braucht.operator==
(und andere Betreiber), dann, wenn Sie es verwenden, erhalten Sie eine implizite Konvertierung von RS, aber nicht die LS. Wenn Sie es implementieren als nicht-member-Funktion, erhalten Sie eine implizite Konvertierung auf beiden. Stil ist alles sehr gut, aber es gibt einige Operatoren, die nicht überladen mit nicht-member-Funktionen, so dass es dauert nur Sie so weit.Ich mag Benoit Antwort (aber ich kann nicht wählen es), aber ich glaube, ein Beispiel würde nicht Schaden, es zu klären. Hier ist etwas Geld code, den ich habe (nehme an, alles andere ist platziert rechts):
Hoffe, das hilft.
Werfen Sie einen Blick auf diese sorta hier zu duplizieren: sollte-Betreiber-werden-realisiert-wie-ein-Freund-oder-wie-ein-Mitglied-Funktion
Was ist wichtig zu betonen, dieser verknüpfte Frage ist die nach
<<
und>>
die umgesetzt werden sollten, wie Freunde, da die beiden Operanden unterschiedliche Typen.In Ihrem Fall macht es Sinn, Sie zu implementieren, als Teil der Klasse. Die Freund-Technik verwendet wird (und nützlich) für die Fälle, in denen mehr als eine Art verwendet wird, und oft nicht für
==
und!=
.Einen operator implementiert als Methode kann nur aufgerufen werden, wenn auf der linken Seite ein Ausdruck ist eine variable (oder eine Referenz auf das Objekt) von der Klasse, die operator ist definiert für.
Im Falle eines
operator==
man in der Regel daran interessiert sind, im Vergleich von zwei Objekten der gleichen Klasse. Implementierung einer Methode löst Ihr problem hier.Sich, jedoch vorstellen, dass Sie schreiben, eine string-Klasse, und Sie möchten, dass ein Betreiber, arbeiten in diesem Szenario:
Zu machen, der Ausdruck
s1 == s2
rechtlichen zu können, definieren Sie eineopetator==
als Funktion externeMyString
Klasse.Wenn der Bediener muss ein Zugriff auf die privaten Mitglieder, wenn Ihre Klasse, Sie hat einen Freund, der Ihre Klasse.
Im Fall von Unternehmen
<<
und>>
, dass die Arbeit auf streams, die Sie definieren einen operator, dessen Linker operand ist eine stream-Instanz und die Rechte Ihrer Klasse, so können Sie nicht sein, die Methoden der Klasse. Wie im obigen Beispiel, Sie müssen die Funktionen, die außerhalb Ihrer Klasse und Freunde, wenn der Zugriff auf private Mitglieder erforderlich ist.