Necesito resolver ese problema. Hay una clase base y dos clases heredadas. La clase base contiene un método que necesita un puntero a función como parámetro. Pero tales funciones se definen en clases heredadas.Indicadores de función de miembro y herencia
class CBase;
typedef bool (CBase::*FPredicate)();
class CBase
{
public:
CBase() {}
~CBase() {}
protected:
//this method waits until 'predicate' is true or until 'timeout' ms. passed
//and returns true if 'predicate' is true eventually
bool WaitEvent(FPredicate predicate, int timeout)
{
bool result = false;
int time1 = GetTickCount();
int time2;
bool isEnd = false;
while(!isEnd)
{
result = isEnd = (this->*predicate)();
time2 = GetTickCount();
if(time2 - time1 > timeout && !isEnd)
isEnd = true;
}
return result;
}
};
class CChildA : public CBase
{
protected:
bool a1() {/*some work*/}
bool a2() {/*some work*/}
void a_main()
{
...
WaitEvent(&CChildA::a1, 100);
...
WaitEvent(&CChildA::a2, 100);
...
}
};
class CChildB : public CBase
{
protected:
bool b1() {/*some work*/}
bool b2() {/*some work*/}
void b_main()
{
...
WaitEvent(&CChildB::b1, 100);
...
WaitEvent(&CChildB::b2, 100);
...
}
};
MSVC 2005 compilador da un error en WaitEvent llama: C2664
error: 'CBase :: WaitEvent': no se puede convertir el parámetro 1 de 'bool (__thiscall CChildA :: *) (void) 'para' FPredicar '
Una pregunta es: ¿cómo debo cambiar el código para que funcione? ¿Será seguro volver a escribir la llamada de WaitEvent como WaitEvent((FPredicate)(&CChildA::a1), 100)
?
En este caso, el compilador no indica ningún error, pero ¿es seguro? ¿O hay una mejor manera de resolver un problema?
Gracias de antemano.
¿hay alguna posibilidad de que pueda usar boost o std :: tr1? En ese caso, simplemente usaría una función y en la clase derivada use bind() con una función miembro –
stijn
@stijn, recuerde, C++ 11 está activo y 'bind()' ya debería estar en 'std ::' . Y generalmente es beneficioso usar -std = C++ 0x, ya que algunas pequeñas características, que ayudan en la programación diaria, ya se pueden usar. – Griwes
¿Puede hacer que las funciones invocables en las clases derivadas sean virtuales desde la clase base? –