請問該如何回傳一個物件? |
尚未結案
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
nlj859你好:
參考下面的code,至於詳細如何運作的,就要請你查查c++有關auto_ptr的解說了。重點在於auto_ptr的copy是物件使用權的轉移,不會有delete或bitwise bopy。
auto_ptr我沒有放在bcb中測試過,請你自行修改一下囉。 |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
我再舉例一下好了:
我有一個class如下:
class Dog { public: AnsiString name; int age; };在main.cpp裡程式如下: void __fastcall TForm1::Button1Click(TObject *Sender) { Dog *d1=new Dog; d1->name="abc"; d1->age=2; update(d1); //d1物件傳到一個自訂的function裡,去做修改name和age的功能 ShowMessage(d1->name); //秀出修改後的name和age delete d1; } //---------------------------------------------------------------- update(Dog *d1) { d1->name="123"; d1->age=1; }請問程式哪裡出錯了? |
markov
中階會員 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations update(Dog *d1); //為何不能放在這裡呢? __fastcall TForm1(TComponent* Owner); };請問放在class TForm1跟外面的差別在哪? |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
如果我想用return物件,那該怎麼做?
void __fastcall TForm1::Button1Click(TObject *Sender) { Dog *d1=new Dog; d1->name="abc"; d1->age=2; update(d1); //d1物件傳到一個自訂的function裡,去做修改name和age的功能 ShowMessage(d1->name); //秀出修改後的name和age delete d1; } //---------------------------------------------------------------- update(Dog *d1) { d1->name="123"; d1->age=1; return d1; //請問這裡,跟main裡面該如何改? } |
markov
中階會員 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
之所以寫在Form1的外面是因為你原本的update函式是宣告成全域函式
所以我也就順著你的意去改寫
如果你要放在Form裡面當然也可以,就變成TForm的member function
不過你的.cpp當中的update function要改成
void __fastcall TForm1::update(Dog *d1)至於你說你想要回傳Dog我覺得沒有必要,除非你的目的是pwipwi所指的物件使用權的轉移否則你都已經使用call by reference實在是沒有必要回傳 |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
引言: 之所以寫在Form1的外面是因為你原本的update函式是宣告成全域函式 所以我也就順著你的意去改寫 如果你要放在Form裡面當然也可以,就變成TForm的member function 不過你的.cpp當中的update function要改成我把他改為下述程式,但還是有問題,請幫忙看一下.void __fastcall TForm1::update(Dog *d1)至於你說你想要回傳Dog我覺得沒有必要,除非你的目的是pwipwi所指的物件使用權的轉移否則你都已經使用call by reference實在是沒有必要回傳 class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations void __fastcall updateData(Dog *d1); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //------------------------------------------------------------------- class Dog { public: AnsiString name; int age; }; void __fastcall TForm1::Button1Click(TObject *Sender) { Dog *d1=new Dog; d1->name="abc"; d1->age=2; updateData(d1); ShowMessage(d1->name); delete d1; } //---------------------------------------------------------------- void __fastcall TForm1::updateData(Dog *d1) { d1->name="123"; d1->age=1; }不曉得哪裡錯了? 另外,能否可以舉一個簡單的例子來說明物件使用權的轉移? 因為不太曉得你所指的意思是什麼? 如果我需要把物件傳遞到另一隻的程式的話,是不是就要用到物件使用權轉移? 謝謝. |
markov
中階會員 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
只要將Dog搬到TForm1的上方即可
class Dog { public: AnsiString name; int age; }; class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations void __fastcall updateData(Dog *d1); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //-------------------------------------------------------------------auto_ptr的簡單範例,擷錄自C 標準程式庫一書 候捷譯 std::auto_ptr每次f()被呼叫,它都new一個新物件,然後把該物件連同擁有權一起傳回給呼叫端,一旦迴圈再次執行f(),則原先擁有的物件就會被刪除,離開g()時,p也會被銷毀. 詳細內容請參閱C 標準程式庫一書 候捷譯 |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
markov
中階會員 發表:55 回覆:135 積分:53 註冊:2003-12-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |