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

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

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

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

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

2 回答

?
紅糖糍粑

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

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

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

我這樣修改了下:Control接收到事件時(比如button被按下)它可以將這個消息傳遞給MainForm,由MainForm來判斷并決定怎么做,而不是把MainForm的成員函數(shù)預(yù)先設(shè)定到Control里面。這樣我覺得比函數(shù)指針要好理解些。
對每個Control設(shè)定它的parent,事件發(fā)生時,就調(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 );
}
};


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

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

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

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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