線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:817
推到 Plurk!
推到 Facebook!

請問該如何回傳一個物件?

尚未結案
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-17 11:58:40 IP:219.80.xxx.xxx 未訂閱
我想回傳一個物件,像底下的範例碼,不曉得能不能這樣, 如果可以,不曉得該怎麼用?在main該如果去宣告? 謝謝.
    DCP DCP::Get(AnsiString Id) 
      {
        DCP* dcp = new DCP("name", "dcp-001", "test", 3);
        return dcp;
      }
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-17 23:35:19 IP:211.76.xxx.xxx 未訂閱
nlj859你好:     參考下面的code,至於詳細如何運作的,就要請你查查c++有關auto_ptr的解說了。重點在於auto_ptr的copy是物件使用權的轉移,不會有delete或bitwise bopy。     
auto_ptr DCP::Get(AnsiString Id) 
      {
        return auto_ptr(new DCP("name", "dcp-001", "test", 3));
      }
//--------------
//用法:
auto_ptr New_Class;
DCP* old_dcp = new DCP("name", "dcp-001", "test", 3);
New_Class.reset(old_dcp->Get(YourID));     
我沒有放在bcb中測試過,請你自行修改一下囉。
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-18 13:25:24 IP:219.80.xxx.xxx 未訂閱
我再舉例一下好了: 我有一個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-18 14:05:27 IP:61.229.xxx.xxx 未訂閱
你的update函式沒有宣告 只要做下列修改即可  
//在.h當中
class Dog
{
 public:
   AnsiString name;
   int age;
};
update(Dog *d1);//加入函式的宣告     
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-18 14:20:07 IP:219.80.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-18 14:23:52 IP:219.80.xxx.xxx 未訂閱
如果我想用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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-18 15:05:17 IP:61.229.xxx.xxx 未訂閱
之所以寫在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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-18 15:55:11 IP:219.80.xxx.xxx 未訂閱
引言: 之所以寫在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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-18 16:19:25 IP:61.229.xxx.xxx 未訂閱
只要將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()
{
   std::auto_ptr ptr(new ClassA);
   return ptr;//移轉擁有權給呼叫端
}    void g()
{
   std::auto_ptr p;
   for(int i=0;i<10;  i)
      p=f();//p取得f()所宣告之ptr的擁有權
}
 
每次f()被呼叫,它都new一個新物件,然後把該物件連同擁有權一起傳回給呼叫端,一旦迴圈再次執行f(),則原先擁有的物件就會被刪除,離開g()時,p也會被銷毀. 詳細內容請參閱C 標準程式庫一書 候捷譯
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-07-18 21:26:42 IP:211.76.xxx.xxx 未訂閱
為何不將update宣告成Dog的member function呢?他只有改變Dog的內容,宣告成Dog的成員函式是比較適合的。 另外你需要回傳物件的目的為何?
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-07-18 22:46:44 IP:220.139.xxx.xxx 未訂閱
我同意pwipwi的看法!提供給nlj859參考
系統時間:2024-05-10 21:10:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!