¿Cómo se llaman entre sí las funciones miembro entre dos clases de C++ y por qué siempre informan errores?
1) Establezca la función miembro que debe llamarse como un tipo estático. Por ejemplo: en el ejemplo 2 anterior, agregue estática antes de la definición de la función miembro de clase Test2. Compare de la siguiente manera (los cambios son). en negrita):
1) p>
class Test2{//….int static __cdecl Compare(const void* elem1, const void* elem2) //Función miembro. //Otros permanecen sin cambios}
El código modificado se compiló exitosamente. La razón es que la función miembro del tipo estático está separada de la clase y su puntero de función no contiene información del objeto, lo cual es consistente con el puntero de función general. Aunque este método es simple, tiene dos desventajas: 1. Ningún miembro de la clase (incluidas variables y funciones) puede aparecer en la definición del miembro de la función llamada. 2. Debido al uso de miembros estáticos, la clase está restringida cuando lo es; heredado.
(2) Utilice una función miembro de tipo estático cuyos parámetros de función contengan información del objeto para llamar indirectamente a otras funciones miembro para su transferencia. Tome el Ejemplo 3 como ejemplo y modifique la clase Test3 de la siguiente manera (las modificaciones están en. negrita), la función main() permanece sin cambios y la compilación se puede pasar sin problemas:
class Test3{public: //…void static __cdecl Helper(Test3* test3){test3->Memberfun2() ;}void Memberfun1( void (* f2)(Test3*)) { f2(this);} // Pasa la información del objeto a la función auxiliar. void Memberfun2( ) {printf(%s \n,Llamando a Test3::Memberfun2 OK } //Función miembro 2. void Memberfun3( ) { Memberfun1( Helper);} //...};
Este método indirecto no tiene ninguna restricción en las funciones miembro, superando las deficiencias del primer método de que las funciones miembro no pueden usar miembros. de cualquier clase, pero debido a la presencia de miembros estáticos, la herencia de clases aún está restringida.
(3) Utilice una función global para llamar indirectamente a la función miembro de la clase. Aún tomando el ejemplo 3 como ejemplo, modifique el código de la siguiente manera (compilado y pasado en VC++6.0):
p>
p>
class Test3;void __cdecl Helper(Test3* test3);class Test3{ public: //… void Memberfun1( void (* f2)(Test3*)) { f2(this);} //Función miembro 1 Llamar a la función miembro //2. void Memberfun2( ) {printf(%s \n,Llamando a Test3::Memberfun2 OK } //Función miembro 2. void Memberfun3( ) { Memberfun1( Helper);} //…};void __cdecl Helper(Test3* test3){test3->Memberfun2();}
Este método no tiene ningún requisito para el miembro funciones, pero requiere más código.