Мне нужно решить такую проблему.Существует базовый класс и два унаследованных класса.Базовый класс содержит метод, который нуждается в указателе функции в качестве параметра.Но такие функции определены в унаследованных классах.
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 выдает ошибку при вызовах WaitEvent:
ошибка C2664: «CBase :: WaitEvent»: невозможно преобразовать параметр 1 из «bool» (__thiscall CChildA ::*) (void) 'to' FPredicate '
Вопрос: как мне изменить код, чтобы он работал?будет ли безопасно переписать вызов WaitEvent как WaitEvent((FPredicate)(&CChildA::a1), 100)
?
В этом случае компилятор не сообщит об ошибке, но безопасно ли это?Или есть лучший способ решения проблемы?
Заранее спасибо.