2012-03-30 14 views
5

Stavo leggendo un tutorial di base C++ quando ho affrontatociò che è :: * in C++

::* 

nel codice seguente. Posso sapere di cosa si tratta:

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() { } 

in base alla mia conoscenza C++ finora, non riesco a capire qualcosa di simile

int A::* point_i2 

mi può aiutare?

grazie.

+6

Un tutorial "base" in C++? Nessun C++ "di base" dovrebbe riguardare gli indicatori dei membri. Hai un link per quel tutorial? –

+0

@NicolBolas potrebbe non essere molto semplice :) http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm – rahman

risposta

6

point_i2 è un puntatore a un membro. Significa che punta a una variabile membro int dichiarata nella classe A.

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

Dopo questo, quando si ha un oggetto casuale A o B, è possibile accedere al membro che point_i2 punti

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

Dopo l'inizializzazione sopra di point_i2, questo cambierebbe b.i.

Pensate ClassName::* stesso modo in cui si pensa di & e *: E 'solo un altro "strumento di puntatore/reference-tipo" è possibile utilizzare nelle dichiarazioni per specificare ciò che la cosa si dichiara sta per essere.

+0

Quindi è simile a un "puntatore della classe membro"? Proprio come i puntatori alla classe del metodo? – Gui13

+4

In parole più semplici. * Puntatore a un membro della classe *. –

+0

@Gui cos'è un puntatore alla classe del metodo? Intendi 'FunctionType A :: *'? Sì, sono uguali. Un puntatore al membro di dati ha il tipo di membro essere un tipo di oggetto, mentre un puntatore alla funzione membro ha il tipo di membro essere un tipo di funzione. Sintatticamente puoi anche usare la sintassi del dichiaratore della funzione per il tipo di funzione per farla apparire come 'R (A :: *) (parametri) cv-qual ref-qual except-spec'. Sebbene non si abbia familiarità con la sintassi C++, è più facile usare i modelli alias e scrivere 'alias A :: *'. –

Problemi correlati