看板 C_and_CPP 關於我們 聯絡資訊
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
LPH66:你 new 一個陣列出來後為什麼不用陣列的方式去存取它? 04/03 01:39
用watch看過實際位址確認 onCommand == &onCommand[0] onCommand+1 == &onCommand[1] 但是 onCommand = new Command(); //ok &onCommand[0] = new Command(); //不過 &onCommand[1] = new Command(); //不過 onCommand+1 = new Command(); //不過
sunneo:onCommand+1得到的是rvalue,是暫時位址,不能拿來assign 04/03 01:40
這無法理解, 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
suhorng: *onCommand = Command(); 04/03 09:34
suhorng: *(onCommand + 1) = Command(); 04/03 09:34
suhorng: onCommand[0] = Command(); 04/03 09:35
suhorng: onCommand[1] = Command(); 04/03 09:35
fakewen:樓上這是可行方法嗎? 還有我不大了解原PO第一三航用同一個 04/03 11:37
fakewen:onCommand變數去接..這樣不會重複定義嗎? 04/03 11:38
chunhsiang:你的觀念不對 這是C++不是JAVA 04/03 12:09
chunhsiang:你已經new出一個包N0個Command物件的陣列 04/03 12:12
chunhsiang:而非參照的陣列 04/03 12:12
amozartea:onCommand +1的地方是非法記憶體耶大哥 04/03 23:07
sunneo:*(onCommand+1) 等同於 onCommand[1] 04/04 12:52
最近在學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
bibo9901:你需要的是 array of *Command 04/04 17:26
bibo9901:意思就是Command *, 或是乾脆用vector<Command*>更簡單 04/04 17:27
bibo9901:更正: ** 04/04 17:27
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