猿问

如果只有1个Form类,就没有问题,请问应该如何实现?

错误代码如下:

class Control;
class Form;
class MainForm;

class Control
{
public:
    void exe()
    { 
        Form* f;
        (f->*_ptr)();
    }
    
    void (Form::*_ptr)();
    void setPtr( void (Form::*ptr)() )
        { _ptr = ptr; }
};

class Form
{

};

class MainForm : public Form
{
    Control c;
    void f();
    void init()
    {
        c.setPtr( &MainForm::f );
    }    
};

int main()
{
    return 0;
}

问题是,我想实现在Control中使用类似回调函数的功能。回调函数定义在Form类的子类里,(如果只有1个Form类,就没有问题)请问应该如何实现?
这是一个实现UI的过程,MainForm是一个具体的窗体,而Control是控件。MainForm中添加任意多的Control对象(比如说TextBox、Button)而每一个对象接收到事件信息后,又要触发处理函数(比如所Button1_Press())。这些函数我是定义在MainForm里的,因为处理函数必须可以“看见”当前Form中的其他对象)。
简而言之,具体的Control(如Button)是一个具体的Form的成员,调用的是具体的Form中新增的函数,它自己甚至不知道Form的存在。

跃然一笑
浏览 144回答 2
2回答

红糖糍粑

好像报错这两种类型是不匹配的。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 eventif(sender == 1 && message == 1)f();}void init(){c.setParent(this );}};

慕少森

要在 class mainform类里声明 friend class control这样类间就可以相互调用函数了~
随时随地看视频慕课网APP
我要回答