Freund UND inline-Methode, was ist der Punkt ?
Sehe ich im Kopf, dass ich nicht selber Schreibe die folgenden:
class MonitorObjectString: public MonitorObject {
//some other declarations
friend inline bool operator==(MonitorObjectString& lhs, MonitorObjectString& rhs) { return(lhs.fVal==rhs.fVal); }
Ich kann nicht verstehen, warum diese Methode ist deklariert als Freund. Ich dachte, es würde Sinn machen, wenn die Funktion definiert ist, in einem anderen Platz und muss auf das interne Mitglied der Klasse, aber dies ist hier nicht der Fall, da es inline-und auch muss, um Zugriff auf die Mitglieder.
Was denkst du? Ist der "Freund" nutzlos?
InformationsquelleAutor der Frage Barth | 2008-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
heißt
friend definition
. Es wird die Funktion definiert als nicht-member-Funktion der umgebenden namespace der Klasse erscheint. Eigentlich ist die inline-es ist redundant: Es ist implizit inline deklariert, wenn es einem Freund-definition. Einige vor-und Nachteile:MonitorObjectString
. Aber das ist weder gut noch schlecht. Es hängt von der situation ab. Zum Beispiel, wenn es gibt FunktionengetFVal()
macht die Funktion Freund ist ziemlich sinnlos. Verwenden konntegetFVal
als-na dann.Früher habe ich gerne dieses Freund-definition-Stil der Betreiber, denn Sie haben direkten Zugang zu Ihrer Klasse, und erscheinen innerhalb der definition der Klasse - so konnte ich "alles mit einem Blick". Vor kurzem kam ich jedoch zu dem Schluss, dass es nicht immer eine gute Idee. Wenn Sie können (und sollten) implementieren Sie den operator rein mit public-member-Funktionen der Klasse, Sie sollten es machen, einen nicht-Freund (und nicht-Mitglied) - operator definiert, die in dem gleichen Namensraum der Klasse. Es stellt sicher, dass, wenn Sie ändern einige Umsetzung - aber halten Sie die Schnittstelle der Klasse die gleichen - der Betreiber noch arbeiten und Sie haben weniger kaskadierenden änderungen, weil Sie wissen, es kann nicht auf Einzelheiten der Implementierung.
Jedochich bevorzuge in diesem Stil über das schreiben Mitglied Operatoren, da die operator-Funktionen im namespace-Gültigkeitsbereich die zusätzlichen Funktionen nicht symmetrisch mit Ihren Argumenten: behandeln Sie nicht die linke Seite etwas besonderes, denn beide Seiten sind nur normale Argumente und nicht Objekt-Argumente gebunden sind
*this
. Wenn entweder die linke oder die Rechte Seite ist von der Art der Klasse, auf der anderen Seite kann implizit konvertiert werden - unabhängig davon, ob es Links oder rechts. Für Funktionen definiert, ohne Freund definition-syntax (traditionell, in namespace scope), Sie haben die Funktion, selektiv, einschließlich Kopf, dass diese Operatoren verfügbar ist oder nicht.InformationsquelleAutor der Antwort Johannes Schaub - litb
Sind Sie nicht gegenseitig ausschließen. "friend" bedeutet nicht-member-Funktion kann den Zugriff auf die privaten Elemente der Klasse. "inline" bedeutet, dass es keine Funktion-Aufruf-Aufruf, der Körper der Funktion ist doppelt vorhanden (in der Baugruppe) bei jedem Aufruf die Seite.
InformationsquelleAutor der Antwort eduffy
Grammatikalisch gesprochen...
Den
friend
Stichwort ist noch zu sagen, benötigt der compiler, dass diese Funktion nicht Mitglied einer Klasse sind, EDIT:sondern eine nicht-member-Funktion, die sehen können die privaten Mitglieder der Klasse.Allerdings könnte dies umgesetzt wurden mehr sauber wie diese:
(Natürlich, ich gehe davon aus
fVal
ist eine geeignete type, die verglichen werden können, ohne dabei die const-ness.)InformationsquelleAutor der Antwort pyon