Vector與初始建構式的問題 |
答題得分者是:harpist
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
最近手賤,想把一些在書本上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的相關文章雖然看了很多,但還是搞不太懂它到底是什麼東西,還煩請諸位賢達能幫忙解答一下。謝謝。 |
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
vector裡面存放的是物件,而我卻丟了位置給它…
所以應該加上「*」成為物件指標來完成! 太感謝啦! <textarea name="code" class="cpp" rows="10" cols="60"> vector ===================引 用 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 發送簡訊給我 |
首先很抱歉!! 我上面提到 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 發送簡訊給我 |
那這樣寫法呢?
<textarea name="code" class="cpp" rows="10" cols="60"> vector 另外,原建構式如下: <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 發送簡訊給我 |
<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
------
~§~迷時師渡,悟了自渡~§~ |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
恕刪…
因為我宣告了一個Vector < Airplane* > ,不是只要下「delete[] planes」就可以刪除了嗎? ===================引 用 harpist 文 章=================== 掌握一個原則讓 new 跟 delete 成對,你的寫法如何去 delete 你 new 的 Airplane 物件呢? ===================引 用 GrandRURU 文 章=================== 那這樣寫法呢? <textarea class="cpp" rows="10" cols="60" name="code"> vector |
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |