2012-03-30 30 views
5

estaba leyendo un tutorial básico de C++ cuando se enfrentaronlo que es :: * en C++

::* 

en el siguiente código. ¿Se puede saber de qué se trata:

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

basado en mi conocimiento de C++ hasta el momento, no puedo comprender algo así como

int A::* point_i2 

usted me podría ayudar?

gracias.

+6

¿Un tutorial "básico" de C++? Ningún C++ "básico" debería estar cubriendo los indicadores de los miembros. ¿Tienes un enlace a ese tutorial? –

+0

@NicolBolas puede no ser muy básico :) http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm – rahman

Respuesta

6

point_i2 es un puntero a un miembro. Significa que apunta a una variable de miembro int que se declara en la clase A.

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

Después de esto cuando se tiene un A al azar o B objeto, puede acceder al miembro que point_i2 puntos a

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

Después de la inicialización por encima de point_i2, esto cambiaría b.i.

Piense en ClassName::* la misma manera que usted piensa de & y *: Es sólo otra "herramienta de puntero/referencia como" que pueden utilizarse en las declaraciones para especificar qué es lo que declara que va a ser.

+0

¿Es esto como un "puntero de clase miembro"? Al igual que los punteros de clase método? – Gui13

+4

En palabras más simples. * Puntero a un miembro de la clase *. –

+0

@Gui ¿qué es un puntero de clase de método? ¿Quiere decir 'FunctionType A :: *'? Sí, son lo mismo. Un puntero al miembro de datos tiene el tipo de miembro ser un tipo de objeto, mientras que un puntero a la función de miembro tiene el tipo de miembro ser un tipo de función. Sintácticamente también puede usar la sintaxis del declarador de funciones para el tipo de función para que se vea como 'R (A :: *) (parámetros) cv-qual ref-qual except-spec'. Aunque si no está familiarizado con la sintaxis de C++ es más fácil usar plantillas de alias y escribir 'alias A :: *'. –

Cuestiones relacionadas