2012-03-30 3 views
5

Ich war ein einfaches C++ Tutorial lesen, wenn ich konfrontiertwas :: * in C++

::* 

in den folgenden Code. Darf ich wissen, was das ist:

class A { 
public: 
protected: 
    int i; 
}; 


class B : public A { 
    friend void f(A*, B*); 
    void g(A*); 
}; 

void f(A* pa, B* pb) { 
// pa->i = 1; 
    pb->i = 2; 

// int A::* point_i = &A::i; 
    int A::* point_i2 = &B::i; 
} 

void B::g(A* pa) { 
// pa->i = 1; 
    i = 2; 

// int A::* point_i = &A::i; 
    int A::* point_i2 = &B::i; 
} 

void h(A* pa, B* pb) { 
// pa->i = 1; 
// pb->i = 2; 
} 

int main() { } 

basiert auf meiner C++ Kenntnisse so weit, ich kann nicht so etwas wie

int A::* point_i2 

könnte Ihnen helfen, mich verstehen?

danke.

+6

Ein "grundlegendes" C++ - Tutorial? Kein "grundlegendes" C++ sollte irgendwas Member-Zeiger abdecken. Hast du einen Link zu diesem Tutorial? –

+0

@ NicolBolas möglicherweise nicht sehr einfach :) http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm – rahman

Antwort

6

point_i2 ist ein Zeiger auf ein Mitglied. Es bedeutet, dass es auf eine int Mitgliedsvariable zeigt, die in der Klasse A deklariert wird.

3
int A::* point_i2 = &B::i; 

Danach, wenn Sie ein zufälliges A oder B Objekt haben, können Sie das Element zugreifen, dass point_i2 Punkte auf

B b; 
b.*point_i2 = ...; 

Nach der obigen Initialisierung von point_i2 diese b.i ändern würde.

Denken Sie an ClassName::* die gleiche Art und Weise, wie Sie denken von & und *: Es ist nur ein weiterer „Zeiger/Referenzartiges Werkzeug“ Sie in Deklarationen verwenden können, um festzulegen, was das, was Sie erklären sein wird.

+0

Also ist das wie ein "Member Class Pointer"? Genau wie die Methodenklassenzeiger? – Gui13

+4

In einfacheren Worten. * Zeiger auf ein Klassenmitglied *. –

+0

@Gui Was ist ein Methodenklassenzeiger? Meinst du 'Funktionstyp A :: *'? Ja, sie sind gleich. Ein Zeiger auf Datenelement hat den Elementtyp einen Objekttyp, während ein Zeiger auf Elementfunktion der Elementtyp ein Funktionstyp ist. Syntaktisch können Sie auch die Funktion declarator-Syntax für den Funktionstyp verwenden, damit er wie folgt aussieht: R (A :: *) (Parameter) cv-qual ref-qual except-spec. Wenn Sie mit der C++ - Syntax nicht vertraut sind, ist es einfacher, Alias-Vorlagen zu verwenden und 'alias A :: *' zu schreiben. –