2 回答
TA贡献1815条经验 获得超6个赞
好像报错这两种类型是不匹配的。
void (Form::*_ptr)();
void (MainForm::* func)();
给他强制转换一下:
typedef void (Form::*_ptr)();
c.setPtr( (func)&MainForm::f );
但是还是不明白你这样做的目的何在。调用另外一个类的成员函数,为什么不通过对象呢?或者静态成员函数也行啊!要不然声明control是MainForm的友元类。
在你原来的Control类的exec函数处理的有问题:
void exe()
{
Form* f; //f没有被实例化,调用成员函数_ptr就会报错。它指向的是无效地址
(f->*_ptr)();
}
我这样修改了下:Control接收到事件时(比如button被按下)它可以将这个消息传递给MainForm,由MainForm来判断并决定怎么做,而不是把MainForm的成员函数预先设定到Control里面。这样我觉得比函数指针要好理解些。
对每个Control设定它的parent,事件发生时,就调用parent的handleEvent函数。这里就是MainForm的handleEvent了。再在里面根据sender和message来调用不同的成员函数。
class Control;
class Form;
class MainForm;
class Form
{
public:
virtual void handleEvent(int sender, int message) = 0;
};
class Control
{
public:
void exe()
{
parent->handleEvent(1,1);
}
Form * parent;
void setParent( Form *form )
{
parent = form;
}
};
class MainForm : public Form
{
public:
Control c;
void f()
{
cout<<"MainForm::f()"<<endl;
};
void handleEvent(int sender, int message)
{
// handle event
if(sender == 1 && message == 1)
f();
}
void init()
{
c.setParent(this );
}
};
- 2 回答
- 0 关注
- 143 浏览
添加回答
举报
