为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
跃然一笑 2022-07-15 16:11:02
错误代码如下: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的存在。
查看完整描述

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 );
}
};


查看完整回答
反对 回复 2022-07-18
?
慕少森

TA贡献2019条经验 获得超9个赞

要在 class mainform类里声明 friend class control
这样类间就可以相互调用函数了~

查看完整回答
反对 回复 2022-07-18
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号