Punteros a funciones con clases, ¿se puede?.

25/05/2004 - 18:23 por Tomás | Informe spam
Hola a todos:

Tengo una clase de propósito general a la que quiero enviar la dirección de
una función, (lo que en "C" es un puntero a función), para que se ejecuten
unas rutinas según el ciclo de trabajo.

El problema es que con clases no se como se puede hacer.

Agradecería cualquier ayuda.

Ejemplo de construcción:

// -Archivo1.cpp/h
class ClaseGeneral
{
public:
HRESULT FuncionA(??? pFuncion(int));
}

HRESULT ClaseGeneral::FuncionA(??? *pFuncion(int))
{
// Hace cosas ...
// Llama a la Funcion2 de la ClaseA
pFuncion???
// Hace mas cosas
return;
}


// -Archivo2.cpp/h
class ClaseA::public ClaseDialogo
{
public:
BOOL Funcion1();
BOOL Funcion2(int);

ClaseGeneral m_ClaseGeneral;
};


BOOL ClaseA::Funcion1()
{
// Hace cosas
// Llama a la FuncionA de la ClaseGeneral.
m_ClaseGeneral.FuncionA(??? Funcion2(int))
// Hace mas cosas
return TRUE;
}

BOOL ClaseA::Funcion2(int)
{
// Hace cosas
return TRUE
}

Gracias por anticipado.

Un saludo.

Tomás
 

Leer las respuestas

#1 Isidro Muñoz
25/05/2004 - 19:52 | Informe spam
Hola,
La principal diferencia de hacer esto en C y en C++ es el parametro this,
En C tu guardas un puntero a una función y cuando la llamas es un call
normal.
En C++ introduce en la pila el puntero this, o sea, la instancia creada y
luego hace el call, para poder acceder a los miembrso de la clase.

Borland en C++ Builder creo la palabra __closure para poder llamar a
funciones de clases, haciendo esto cuando se llama a la función introduce el
this en la pila. Creo que en Visual C++ 7.00 hay algo tambien para esto.

Una cosa que puedes hacer es declarar la función como static dentro de la
clase general, y se comportará como una función global.

Ahora mismo no lo recuerdo pero puedes mirar los punteros a funciones
miembrso en C++.

Pero si usas C++ puedes solvertarlo de otra forma, Si quieres llamar a una
función y pasarle un puntero a una función de una clase, evidentemente lo
que quieres es poder llamarlo desde diferentes clases porque si no no tiene
sentido.

Create una clase padre con la función Función2 como virtual pura, luego
haces que ClaseA herede de ella y todas las clases que quieras llamar a su
función tambien las haces que hereden de esta.

Cuando llames a m_ClaseGeneral le pases la clase padre, y luego desde
m_ClaseGeneral llamas al método Funcion2.

Quedaría así:

class ClaseGeneral
{
public:
HRESULT FuncionA(ClasePadre *p);
}

HRESULT ClaseGeneral::FuncionA(ClasePadre *p)
{
// Hace cosas ...
// Llama a la Funcion2 de la ClaseA
p->Funcion2();
// Hace mas cosas
return;
}

class ClasePadre
{
public:
virtual BOOL Funcion2(int)=0;
}

// -Archivo2.cpp/h
class ClaseA::public ClaseDialogo: public ClasePadre
{
public:
BOOL Funcion1();
BOOL Funcion2(int);

ClaseGeneral m_ClaseGeneral;
};


BOOL ClaseA::Funcion1()
{
// Hace cosas
// Llama a la FuncionA de la ClaseGeneral.
m_ClaseGeneral.FuncionA(this)
// Hace mas cosas
return TRUE;
}
BOOL ClaseA::Funcion2(int)
{
// Hace cosas
return TRUE
}


Tambien puedes hacer otra cosa, llamar a la función de proposito general
desde Funcion1 guardar los datos en un miembro de la clase A y luego llamar
a Funcion2 desde Clase A

HRESULT ClaseGeneral::FuncionA()
{
// Hace cosas ...
// Llama a la Funcion2 de la ClaseA
//Guardas los datos en un miembro de Clase General, por ejemplo aux;
aux=5;
// Hace mas cosas
return;
}

BOOL ClaseA::Funcion1()
{
// Hace cosas
// Llama a la FuncionA de la ClaseGeneral.
m_ClaseGeneral.FuncionA()
m_ClaseGenerla.aux <- Aqui tengo el valor creado en FuncionA
// Hace mas cosas
return TRUE;
}
BOOL ClaseA::Funcion2(int)
{
// Hace cosas
return TRUE
}


Saludos,
Isidro.

"Tomás" escribió en el mensaje
news:%
Hola a todos:

Tengo una clase de propósito general a la que quiero enviar la dirección


de
una función, (lo que en "C" es un puntero a función), para que se ejecuten
unas rutinas según el ciclo de trabajo.

El problema es que con clases no se como se puede hacer.

Agradecería cualquier ayuda.

Ejemplo de construcción:

// -Archivo1.cpp/h
class ClaseGeneral
{
public:
HRESULT FuncionA(??? pFuncion(int));
}

HRESULT ClaseGeneral::FuncionA(??? *pFuncion(int))
{
// Hace cosas ...
// Llama a la Funcion2 de la ClaseA
pFuncion???
// Hace mas cosas
return;
}


// -Archivo2.cpp/h
class ClaseA::public ClaseDialogo
{
public:
BOOL Funcion1();
BOOL Funcion2(int);

ClaseGeneral m_ClaseGeneral;
};


BOOL ClaseA::Funcion1()
{
// Hace cosas
// Llama a la FuncionA de la ClaseGeneral.
m_ClaseGeneral.FuncionA(??? Funcion2(int))
// Hace mas cosas
return TRUE;
}

BOOL ClaseA::Funcion2(int)
{
// Hace cosas
return TRUE
}

Gracias por anticipado.

Un saludo.

Tomás


Preguntas similares