Función de clase

Ticos
07 de Julio del 2004
/*
Como hacer para pasar una función privada de una clase como parametro de una función externa, por ejemplo "setvect" en "dos.h" de "Borland C++ 3.1" o la función que se muestra en el código
*/
#include <stdio.h>

void FuncionExterna(...)
{
puts("FuncionExterna");
}

void Enlace(void (*Funcion)(...))
{
Funcion();
}

class Prueba
{
private:
void FuncionInterna(...)
{
puts("FuncionInterna");
}

public:
void Llamado(void)
{
Enlace(FuncionExterna);
Enlace(FuncionInterna); /*Error:
Member function must be called or its address taken
Type mismatch in parameter 'Funcion' in call to 'Enlace(void (*)(...))'*/
}
};

void main(void)
{
Prueba PruebaA;

PruebaA.Llamado();
}

Alejandro_
07 de Julio del 2004

Hola Ticos;

Cambié un poco el código que pones para poder compilarlo. Te cuento los cambios:

La función miembro no estática recibe un parámetro oculto: el puntero this, así que a FuncionInterna la hice static.

Otro cambio importante: declaré a la función Enlace como función friend, para que pueda acceder a funciones miembro "private" de Prueba. (La otra opción pudo haber sido poner a FuncionInterna en la parte pública).

La línea:
Enlace(&Prueba::FuncionInterna );

también pudo ser escrita:
Enlace(FuncionInterna);

pero creo que la segunda forma de tomar la dirección de una función miembro no la aceptan todos los compiladores. Acá va:



#include <stdio.h>
#include <stdlib.h>

void FuncionExterna(...)
{
puts("FuncionExterna");
}

void Enlace(void (*Funcion)(...))
{
Funcion();
}

class Prueba
{
private:
friend void Enlace(void(*Funcion)(...));
static void FuncionInterna(...)
{
puts("FuncionInterna");
}

public:
void Llamado(void)
{
Enlace(FuncionExterna);
Enlace(&Prueba::FuncionInterna );
}
};



int main(void)
{
Prueba PruebaA;

PruebaA.Llamado();

getchar();
}

// Alejandro