Was sind die Pointer-zu-Member - & gt; * und. * Operatoren in C ++?
Ja, ich habe gesehen, diese Frage und diese FAQ (falscher link) diese FAQaber ich noch nicht verstehen, was ->*
und .*
bedeuten in C++.
Diese Seiten bieten Informationen über den Operatoren (wie überlastung), aber offenbar nicht gut erklären, was Sie sind.
Was sind ->*
und .*
in C++, und wenn Sie benötigen, um Sie als im Vergleich zu ->
und .
?
InformationsquelleAutor der Frage Mehrdad | 2011-07-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hoffe, dieses Beispiel wird klar, Dinge, die für Sie
Nun, Sie können nicht
x.somePointer()
oderpx->somePointer()
weil es keine solche Mitglied in der Klasse X. Für Sie, dass die special-member-Funktion-Zeiger-Aufruf-syntax verwendet wird... probier einfach mal ein paar Beispiele zu sich selbst ,Sie werden sich daran gewöhnenInformationsquelleAutor der Antwort Armen Tsirunyan
EDIT: By the way, es ist schon komisch für virtuellen member-Funktionen, Zeiger.
Für member-Variablen:
Member-Funktionen sind fast die gleichen.
InformationsquelleAutor der Antwort spraff
Kurz gesagt: Sie verwenden
->
und.
wenn Sie wissen, was die Sie zugreifen möchten. Und Sie verwenden->*
und.*
wenn Sie nicht wissen, was die Sie zugreifen möchten.Beispiel mit einem einfachen intrusive Liste
InformationsquelleAutor der Antwort Johannes Schaub - litb
Sogenannte "Zeiger" an die Mitglieder, die in C++ sind mehr wie offsets, intern. Sie brauchen beides, so ein Mitglied, "Zeiger", und ein Objekt Bezug zu nehmen, der Mitglied in das Objekt. Aber die "Zeiger" verwendet werden, mit Zeiger-syntax, daher der name.
Gibt es zwei Möglichkeiten, die Sie haben können, ein Objekt auf der hand: Sie haben einen Verweis auf das Objekt, oder Sie haben einen Zeiger auf das Objekt.
Für die Referenz, verwenden Sie
.*
kombiniert mit einem Mitglied Zeiger, und der Zeiger, verwenden Sie->*
kombiniert mit einem Mitglied Zeiger.Jedoch in der Regel nicht verwenden member-Zeiger, wenn Sie es vermeiden können.
Befolgen Sie ziemlich counter-intuitive Regeln, und Sie machen es möglich, Sie zu umgehen
protected
Zugriff ohne explizite Umwandlung, das heißt, versehentlich...Cheers & hth.,
InformationsquelleAutor der Antwort Cheers and hth. - Alf
Wenn Sie einen normalen pointer (auf ein Objekt oder ein basic-Typ), verwenden Sie
*
zu dereferenzieren:Konzeptionell, wir tun die gleiche Sache mit einer member-Funktion-Zeiger:
Ich hoffe, dass hilft zu erklären, das Konzept. Wir sind effektiv dereferenzieren unsere Zeiger auf die Memberfunktion. Es ist ein wenig komplizierter als das-es ist nicht eine absolute Zeiger auf eine Funktion im Speicher, sondern nur einen offset, die angewendet wird, um
foo
oderp
oben. Aber konzeptionell sind wir dereferenzieren, wie viel würden wir dereferenzieren einer normalen Objekt-Zeiger.InformationsquelleAutor der Antwort Tim
Können Sie nicht Dereferenzierung Zeiger auf Mitglieder wie normale Zeiger, da die Funktionen erfordern
this
Zeiger, und Sie haben, Sie zu passieren irgendwie. So müssen Sie die Verwendung dieser beiden Operatoren, mit Objekt auf der einen Seite, und der Zeiger auf ein anderes, z.B.(object.*ptr)()
.Erwägen Sie die Verwendung
function
undbind
(std::
oderboost::
je nachdem, ob Sie schreiben C++03 oder 0x), statt die, zwar.InformationsquelleAutor der Antwort Cat Plus Plus