全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1959
推到 Plurk!
推到 Facebook!

Vector與初始建構式的問題

答題得分者是:harpist
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-19 17:28:43 IP:203.75.xxx.xxx 未訂閱
最近手賤,想把一些在書本上c語言的範例轉成c++
但是又有點腦殘…又改不出來…Orz
所以很不好意思的上來求助一下
範例從bcb21 day 自學實務上抄下來的
以下是飛機的初始化的函式宣告:

Airplane(const String _name, int _type = AIRLINER);


然後我在「機場」(airport)造了三架飛機,以下是原式

Airplane* planes[3];
planes[0] = new Airplane("TWA 1040");
.
.
.

之前從c 之父寫的"c 程式設計經典本"有看到說"vector"比用陣列好,而且還強力推薦,於是小弟就改成如下:
vector < Airplane > planes;
planes.reserve(3);
planes[0] = new Airplane("TWA 1040");
.
.
.

但是在編譯時出現以下的錯誤訊息:

[C Error] Airport.cpp(23): E2285 Could not find a match for 'Airplane::operator =(Airplane *)'

這跟運算子應該沒有關係吧…還是我哪邊呼叫錯誤呢?
不好意思,vector的相關文章雖然看了很多,但還是搞不太懂它到底是什麼東西,還煩請諸位賢達能幫忙解答一下。謝謝。
編輯記錄
GrandRURU 重新編輯於 2007-07-19 17:41:28, 註解 無‧
GrandRURU 重新編輯於 2007-07-19 17:43:10, 註解 無‧
GrandRURU 重新編輯於 2007-07-19 17:47:10, 註解 無‧
GrandRURU 重新編輯於 2007-07-19 17:49:11, 註解 無‧
GrandRURU 重新編輯於 2007-07-19 18:04:06, 註解 改了這麼多次…程式碼還是不正常…放棄‧
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-20 00:01:37 IP:211.74.xxx.xxx 未訂閱
<textarea class="cpp" rows="10" cols="60" name="code"> planes[0] = *(new Airplane("TWA 1040")); </textarea> 思考一下 vector 裡面存放的是什麼? constructor 傳回的又是什麼呢?
------
~§~迷時師渡,悟了自渡~§~
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-20 14:17:07 IP:203.75.xxx.xxx 未訂閱
vector裡面存放的是物件,而我卻丟了位置給它…
所以應該加上「*」成為物件指標來完成!
太感謝啦!

<textarea name="code" class="cpp" rows="10" cols="60"> vector planes; planes.reserve(3); planes[0] = new Airplane("TWA 1040"); </textarea>
===================引 用 harpist 文 章===================
<textarea class="cpp" rows="10" cols="60" name="code"> planes[0] = *(new Airplane("TWA 1040")); </textarea> 思考一下 vector 裡面存放的是什麼? constructor 傳回的又是什麼呢?
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-20 16:11:52 IP:211.74.xxx.xxx 未訂閱
首先很抱歉!! 我上面提到 constructor 傳回什麼其實是不正確的敘述,
應該是說使用new 算式動態配置一個物件後傳回物件的位址。另外
「*」是取值運算子而非加上「*」成為物件指標。

<textarea class="cpp" rows="10" cols="60" name="code">planes[0] = *(new Airplane("TWA 1040")); </textarea>
另外上面這一種方式是不正確的,因為planes vector container 是一個存放 Airplane 物件的容器,
而這一行使用 new 產生了一個不具名的 Airplane 然後當使用 = 運算子指定給 planes[0] 時其實拷貝
了不具名 Airplane 物件的內容到 planes[0] ,於是 planes[0] 有著相同的內容,但執行完後產生的不
具名 Airplane 物件還存在但我們卻無法管理這個物件,如此將可能會造成 memory leak。

<textarea class="cpp" rows="10" cols="60" name="code"> planes.reserve(3); Airplane *a1 = new Airplane("TWA 1040"); //這樣比較好 planes[0] = *a1; a1->Name = "123"; ShowMessage(a1->Name); //123 ShowMessage(planes[0].Name); //TWA 1040 delete a1; //釋放a1</textarea>

------
~§~迷時師渡,悟了自渡~§~
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-20 16:42:49 IP:203.75.xxx.xxx 未訂閱
那這樣寫法呢?
<textarea name="code" class="cpp" rows="10" cols="60"> vector planes; planes.reserve(3); planes[0] = new Airplane("TWA 1040"); planes[1] = new Airplane("United Express 749", COMMUTER); </textarea>

另外,原建構式如下:
<textarea cols="60" rows="10" class="cpp" name="code"> Airplane::Airplane(const String& _name,int _type): type(_type), status(ONRAMP), speed(0), altitude(0), heading(0) { switch(type) { case AIRLINER: ceiling = 35000; break; case COMMUTER: ceiling = 20000; break; case PRIVATE: ceiling = 8000; } name = _name; //name為public } </textarea>

===================引 用 harpist 文 章===================
首先很抱歉!! 我上面提到 constructor 傳回什麼其實是不正確的敘述,
應該是說使用new 算式動態配置一個物件後傳回物件的位址。另外
「*」是取值運算子而非加上「*」成為物件指標。

<textarea class="cpp" rows="10" cols="60" name="code">planes[0] = *(new Airplane("TWA 1040")); </textarea>
另外上面這一種方式是不正確的,因為planes vector container 是一個存放 Airplane 物件的容器,
而這一行使用 new 產生了一個不具名的 Airplane 然後當使用 = 運算子指定給 planes[0] 時其實拷貝
了不具名 Airplane 物件的內容到planes[0] ,於是 planes[0] 有著相同的內容,但執行完後產生的不
具名 Airplane 物件還存在但我們卻無法管理這個物件,如此將可能會造成 memory leak。

<textarea class="cpp" rows="10" cols="60" name="code"> planes.reserve(3); Airplane *a1 = new Airplane("TWA 1040"); //這樣比較好 planes[0] = *a1; a1->Name = "123"; ShowMessage(a1->Name);//123 ShowMessage(planes[0].Name); //TWA 1040 delete a1;//釋放a1</textarea>

harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-20 22:31:05 IP:211.74.xxx.xxx 未訂閱
<textarea class="cpp" rows="10" cols="60" name="code">planes.reserve(3); Airplane *a1 = new Airplane("TWA 1040");//讓物件具名這樣比較好 planes[0] = *a1; //這裡是拷貝內容不是把a1指定給planes[0] a1->Name = "123"; //a1->Name已經變成123 ShowMessage(a1->Name); //a1->Name 是123 ShowMessage(planes[0].Name); //planes[0]內 Airplane 的 Name 依舊是TWA 1040 delete a1; //釋放動態建置的Airplane 物件 </textarea>
掌握一個原則讓 new 跟 delete 成對,你的寫法如何去 delete 你 new 的 Airplane 物件呢?

===================引 用 GrandRURU 文 章===================
那這樣寫法呢?
<textarea class="cpp" rows="10" cols="60" name="code">???? vector planes;???? planes.reserve(3);???? planes[0] = new Airplane("TWA 1040");???? planes[1] = new Airplane("United Express 749", COMMUTER); </textarea>




------
~§~迷時師渡,悟了自渡~§~
編輯記錄
harpist 重新編輯於 2007-07-20 22:34:25, 註解 無‧
harpist 重新編輯於 2007-07-20 22:40:50, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-23 09:02:14 IP:203.75.xxx.xxx 未訂閱
恕刪…
因為我宣告了一個Vector < Airplane* > ,不是只要下「delete[] planes」就可以刪除了嗎?

===================引 用 harpist 文 章===================

掌握一個原則讓 new 跟 delete 成對,你的寫法如何去 delete 你 new 的 Airplane 物件呢?

===================引 用 GrandRURU 文 章===================
那這樣寫法呢?
<textarea class="cpp" rows="10" cols="60" name="code"> vector planes; planes.reserve(3); planes[0] = new Airplane("TWA 1040"); planes[1] = new Airplane("United Express 749", COMMUTER); </textarea>
編輯記錄
GrandRURU 重新編輯於 2007-07-23 09:03:31, 註解 無‧
GrandRURU 重新編輯於 2007-07-23 09:04:12, 註解 無‧
GrandRURU 重新編輯於 2007-07-23 09:05:01, 註解 無‧
GrandRURU 重新編輯於 2007-07-23 09:05:52, 註解 無‧
GrandRURU 重新編輯於 2007-07-23 09:06:44, 註解 無‧
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-07-23 12:48:08 IP:59.105.xxx.xxx 未訂閱
你確定我貼的範例跟文字描述你都有仔細看過嗎?
delete[] planes 到底刪除的是什麼? 是你用 new 產生的 Airplane Object 嗎?
vector 裡面到底存放的是什麼?
------
~§~迷時師渡,悟了自渡~§~
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-07-24 14:18:42 IP:203.75.xxx.xxx 未訂閱
看了好久,總算是看懂一點了…
謝謝harpist大不厭其煩地解了 :D

我會再努力看的,謝謝 :D
===================引 用 harpist 文 章===================
你確定我貼的範例跟文字描述你都有仔細看過嗎?
delete[] planes 到底刪除的是什麼? 是你用 new 產生的 Airplane Object 嗎?
vector 裡面到底存放的是什麼?
系統時間:2024-05-02 19:34:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!