亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果只有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 關注
  • 111 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號