[問題] 動態產生的物件指標陣列,只能存取第0個

看板C_and_CPP (C/C++)作者 (800IM)時間12年前 (2014/04/03 01:20), 12年前編輯推噓5(5011)
留言16則, 7人參與, 最新討論串1/3 (看更多)
class RemoteControl { private: Command* onCommand; //數量尚未決定 Command* offCommand; public: RemoteControl(int No) { onCommand = new Command[No]; offCommand = new Command[No]; onCommand = new Command(); onCommand+1 = new Command(); //ERROR,編譯不過 } } 這是一個我覺得很奇怪的地方, complier都不知道我 No 要輸入多少, 先擅自阻止我存取第 0 個以外的物件指標, 覺得如果會錯,應該也是runtime out of range才有錯, 應該是我哪裡沒有想通?? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.245.65.143 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1396459225.A.F68.html

04/03 01:39, , 1F
你 new 一個陣列出來後為什麼不用陣列的方式去存取它?
04/03 01:39, 1F
用watch看過實際位址確認 onCommand == &onCommand[0] onCommand+1 == &onCommand[1] 但是 onCommand = new Command(); //ok &onCommand[0] = new Command(); //不過 &onCommand[1] = new Command(); //不過 onCommand+1 = new Command(); //不過

04/03 01:40, , 2F
onCommand+1得到的是rvalue,是暫時位址,不能拿來assign
04/03 01:40, 2F
這無法理解, onCommand+1 不是我用new在記憶體中劃好可以支配的位址嗎? ※ 編輯: deo2000 (60.245.65.143), 04/03/2014 02:42:07 ※ 編輯: deo2000 (60.245.65.143), 04/03/2014 02:43:57

04/03 09:34, , 3F
*onCommand = Command();
04/03 09:34, 3F

04/03 09:34, , 4F
*(onCommand + 1) = Command();
04/03 09:34, 4F

04/03 09:35, , 5F
onCommand[0] = Command();
04/03 09:35, 5F

04/03 09:35, , 6F
onCommand[1] = Command();
04/03 09:35, 6F

04/03 11:37, , 7F
樓上這是可行方法嗎? 還有我不大了解原PO第一三航用同一個
04/03 11:37, 7F

04/03 11:38, , 8F
onCommand變數去接..這樣不會重複定義嗎?
04/03 11:38, 8F

04/03 12:09, , 9F
你的觀念不對 這是C++不是JAVA
04/03 12:09, 9F

04/03 12:12, , 10F
你已經new出一個包N0個Command物件的陣列
04/03 12:12, 10F

04/03 12:12, , 11F
而非參照的陣列
04/03 12:12, 11F

04/03 23:07, , 12F
onCommand +1的地方是非法記憶體耶大哥
04/03 23:07, 12F

04/04 12:52, , 13F
*(onCommand+1) 等同於 onCommand[1]
04/04 12:52, 13F
最近在學C#所以有點搞混了, 因為C#和Java好像都一定要 執行n次 new Command() 才會建構出n個物件, 剛用建構子cout檢查過, 原來C++ new Command[n] 一次就可以建構n個物件,而不只是ref 我的目的是要在指向 n 個物件的陣列上, 隨時抽換所指的物件 (這是設計模式作業) 那請問在C++要怎麼做呢?? 我查了好幾本書都沒講到這種作法 ※ 編輯: deo2000 (1.167.192.145), 04/04/2014 16:29:22

04/04 17:26, , 14F
你需要的是 array of *Command
04/04 17:26, 14F

04/04 17:27, , 15F
意思就是Command *, 或是乾脆用vector<Command*>更簡單
04/04 17:27, 15F

04/04 17:27, , 16F
更正: **
04/04 17:27, 16F
vector<Command*>很方便, 但是我這不是在趕出貨, 想要先慢慢把指標磨好 用2D 動態arrayr結果變這樣 public: RemoteControl(int No) { cout << "RemoteControl物件 建構開始" << endl; for(int i=0;i<No;i++) { (*ptr_onCommand)+i = new Command();//compiler ERROR 必須是可修改的左值,我覺得這個比較正確 *(ptr_offCommand+i) = new Command();//runtime ERROR 存取違規 } cout << "RemoteControl物件 建構結束" << endl; } ※ 編輯: deo2000 (42.78.201.190), 04/04/2014 20:52:35 ※ 編輯: deo2000 (42.78.201.190), 04/04/2014 20:54:48
文章代碼(AID): #1JF4RPze (C_and_CPP)
文章代碼(AID): #1JF4RPze (C_and_CPP)