Pregunta

Acabo de encontrar un código C ++ (en http://msdn.microsoft.com/en-us/library/k8336763(VS.71).aspx ), que utiliza una técnica que nunca antes había visto para agregar tipos a una clase existente:

class Testpm {
public:
   void m_func1() { cout << "m_func1\n"; }
   int m_num;
};

// Define derived types pmfn and pmd.
// These types are pointers to members m_func1() and m_num, respectively.
void (Testpm::*pmfn)() = &Testpm::m_func1;
int Testpm::*pmd = &Testpm::m_num;

int main() {
   Testpm ATestpm;
   Testpm *pTestpm = new Testpm;

   // Access the member function
   (ATestpm.*pmfn)();
   (pTestpm->*pmfn)();   // Parentheses required since * binds

   // Access the member data
   ATestpm.*pmd = 1;
   pTestpm->*pmd = 2;

   cout  << ATestpm.*pmd << endl
         << pTestpm->*pmd << endl;
}

¿Puede alguien decirme cómo se llama esta técnica para definir tipos derivados o indicarme alguna documentación al respecto? Nunca lo he encontrado en 13 años de usar C ++, y me gustaría terminar con mi ignorancia.

¿Fue útil?

Solución

El comentario es incorrecto: pmfn y pmd no son "tipos derivados" en absoluto (¡ni siquiera son tipos!). Son punteros a los miembros .

Otros consejos

No creo que estén "agregando tipos" a la clase. Parecen simplemente definir tipos de punteros a funciones miembro y datos miembro de la clase, y luego usarlos para acceder a la función miembro y miembro de datos. Similar a cómo declararía los tipos a funciones que no son miembros, pero al ser miembros de la clase, la sintaxis difiere.

Desde este sitio aquí

  

Con respecto a su sintaxis, hay dos   diferentes tipos de punteros de función:   Por un lado, hay punteros para   funciones C ordinarias o para C ++ estático   funciones miembro Por otra parte   hay punteros a C ++ no estático   funciones miembro La diferencia basica   es que todos los punteros a no estáticos   las funciones miembro necesitan un oculto   argumento: el indicador de este a un   instancia de la clase. Siempre mantener en   mente: estos dos tipos de funciones   los punteros son incompatibles con cada   otro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top