Ho bisogno di risolvere un problema del genere. Esiste una classe base e due classi ereditate. La classe base contiene un metodo che ha bisogno di un puntatore a funzione come parametro. Ma tali funzioni sono definite nelle classi ereditate.Puntatori funzione ed eredità
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 compilatore dà un errore sul WaitEvent chiama:
errore C2664: 'CBase :: WaitEvent': non può convertire il parametro 1 da 'bool (__thiscall CChildA :: *) (void) 'a' FPredicate '
Una domanda è: come devo cambiare il codice per farlo funzionare? sarà sicuro riscrivere la chiamata WaitEvent come WaitEvent((FPredicate)(&CChildA::a1), 100)
?
In questo caso il compilatore non dice errori ma è sicuro? O c'è un modo migliore per risolvere un problema?
Grazie in anticipo.
c'è qualche possibilità che tu possa usare boost o std :: tr1? In questo caso useresti semplicemente una funzione e nella classe derivata usi bind() con una funzione membro –
stijn
@stijn, ricorda, C++ 11 è live e 'bind()' dovrebbe già essere in 'std ::' . Ed è generalmente utile usare -std = C++ 0x, dato che alcune piccole funzionalità, che aiutano nella programmazione quotidiana, sono già utilizzabili. – Griwes
È possibile rendere virtuali le funzioni callable nelle classi derivate dalla classe base? –