Я читал о делегировании, и я хотел иметь возможность вызывать с базовым классом любой проход функции в качестве параметра в зависимости от события, я сделал это таким образом, и это работает, но я не уверен, является ли это правильным способом, и если это портативный, как это.
class base {
public:
typedef void (base::*methodPTR)();
methodPTR pfn;
void setMethod(methodPTR fn)
{
pfn = fn;
}
void run(){
if(pfn) (this->*pfn)();
}
};
class a : public base {
public:
void fn()
{
cout<<"from class a!"<<endl;
}
};
class b : public base
{
a ob;
public:
void init()
{
ob.setMethod(static_cast<base::methodPTR>(&b::fn));
}
void fn()
{
cout << "from class b!" << endl;
}
void test()
{
ob.run();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
b x;
x.init();
x.test();
return 0;
}
Вы вызываете функцию-член fn
класса b
с экземпляром класса a
что приведет к неопределенному поведению, если вы получите доступ к элементам данных вашего класса.
Замени свои занятия a
а также b
с этим, чтобы увидеть магию:
class a : public base {
int j;
public:
a()
{
j = 42;
}
void fn()
{
cout<<"from class a!"<<endl;
}
};
class b : public base
{
int i;
a ob;
public:
void init()
{
i = 5;
ob.setMethod(static_cast<base::methodPTR>(&b::fn));
}
void fn()
{
cout << "from class b!" << endl;
cout << "i = " << i << endl;
}
void test()
{
ob.run();
}
};
Других решений пока нет …