¿Cómo se llama esta técnica de C ++ para agregar tipos a una clase?
-
10-07-2019 - |
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.
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.