第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如果只有1個(gè)Form類,就沒有問題,請(qǐng)問應(yīng)該如何實(shí)現(xiàn)?

如果只有1個(gè)Form類,就沒有問題,請(qǐng)問應(yīng)該如何實(shí)現(xiàn)?

C++
躍然一笑 2022-07-15 16:11:02
錯(cuò)誤代碼如下: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;}問題是,我想實(shí)現(xiàn)在Control中使用類似回調(diào)函數(shù)的功能?;卣{(diào)函數(shù)定義在Form類的子類里,(如果只有1個(gè)Form類,就沒有問題)請(qǐng)問應(yīng)該如何實(shí)現(xiàn)?這是一個(gè)實(shí)現(xiàn)UI的過程,MainForm是一個(gè)具體的窗體,而Control是控件。MainForm中添加任意多的Control對(duì)象(比如說TextBox、Button)而每一個(gè)對(duì)象接收到事件信息后,又要觸發(fā)處理函數(shù)(比如所Button1_Press())。這些函數(shù)我是定義在MainForm里的,因?yàn)樘幚砗瘮?shù)必須可以“看見”當(dāng)前Form中的其他對(duì)象)。簡(jiǎn)而言之,具體的Control(如Button)是一個(gè)具體的Form的成員,調(diào)用的是具體的Form中新增的函數(shù),它自己甚至不知道Form的存在。
查看完整描述

2 回答

?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊

好像報(bào)錯(cuò)這兩種類型是不匹配的。
void (Form::*_ptr)();
void (MainForm::* func)();
給他強(qiáng)制轉(zhuǎn)換一下:
typedef void (Form::*_ptr)();
c.setPtr( (func)&MainForm::f );
但是還是不明白你這樣做的目的何在。調(diào)用另外一個(gè)類的成員函數(shù),為什么不通過對(duì)象呢?或者靜態(tài)成員函數(shù)也行啊!要不然聲明control是MainForm的友元類。

在你原來的Control類的exec函數(shù)處理的有問題:
void exe()
{
Form* f; //f沒有被實(shí)例化,調(diào)用成員函數(shù)_ptr就會(huì)報(bào)錯(cuò)。它指向的是無效地址
(f->*_ptr)();
}

我這樣修改了下:Control接收到事件時(shí)(比如button被按下)它可以將這個(gè)消息傳遞給MainForm,由MainForm來判斷并決定怎么做,而不是把MainForm的成員函數(shù)預(yù)先設(shè)定到Control里面。這樣我覺得比函數(shù)指針要好理解些。
對(duì)每個(gè)Control設(shè)定它的parent,事件發(fā)生時(shí),就調(diào)用parent的handleEvent函數(shù)。這里就是MainForm的handleEvent了。再在里面根據(jù)sender和message來調(diào)用不同的成員函數(shù)。

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


查看完整回答
反對(duì) 回復(fù) 2022-07-18
?
慕少森

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊

要在 class mainform類里聲明 friend class control
這樣類間就可以相互調(diào)用函數(shù)了~

查看完整回答
反對(duì) 回復(fù) 2022-07-18
  • 2 回答
  • 0 關(guān)注
  • 120 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)