看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《pracinverse (改)》之銘言: : MethodA在function裡面new,需要告知使用者記得要delete, : MethodB須告知使用者呼叫之前要先new, : 因為在使用者這邊new,使用者自己知道需要做delete, : MethodA和MethodB的做法都有看過,哪種方式比較好呢??? 都不好 直接回傳 std::string 是最好用的介面 呼叫端既不需要事先配置空間 也不需要手動釋放記憶體 : Q2. 當你開出一系列的function給別人呼叫,但這些function需要按照一定的順序呼叫, : 比方說順序為: EnumerateObj() --> CreateObj --> UseObj() ... : 如果使用者不按這個順序呼叫可能會crash,但你又沒辦法預期使用者不會亂呼叫, : 你該怎麼預防crash呢???? : 我目前想到的是在自己的程式這邊紀錄state,比方說: : void UseObj() : { : if(currentState != READY_TO_USE) { : return -1; : } : ... : } : 在每個function裡面的一開始,都先檢查目前的state是否可以呼叫這個function, : 但又覺得這樣做有點麻煩,不知道有沒有更好的做法???? EnumerateObj → CreateObj → CreateObj → UseObj → UseObj 這樣合法嗎? 如果說 EnumerateObj 後面一定接一個 CreateObj 然後又固定接一個 UseObj 那麼直覺地想就是包成一個大的 function 如果是依照 EnumerateObj 的結果可以 CreateObj 很多次 然後對每個 object 呼叫 UseObj 你可以把 CreateObj 這個操作綁在 EnumerateObj 的回傳值上 class EnumerateResult { public: Object CreateObj(); }; EnumerateResult EnumerateObj() { // ... return EnumerateResult; } 這麼一來,你可以確保使用者呼叫過 EnumerateObj 後才能呼叫 CreateObj 同樣地把 UseObj 綁在 CreateObj 的回傳值上 這樣一來一定要呼叫 CreateObj 後才能呼叫 UseObj -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.77.128
diabloevagto:Q2指的是Decorator? 03/04 13:55
diabloevagto:http://ppt.cc/C@NI 03/04 13:58
littleshan:No 這不是 decorator 03/04 14:06
diabloevagto:這用decorator好像也ok,還是會有什麼比較不好的? 03/04 14:17
Arton0306:一般decorator回傳的是同一物件 也沒有順序 03/05 15:52
legnaleurc:我覺得他想包的是純 C 的 library 03/05 17:15
diabloevagto:decorator包裝的順序就是要執行的順序啊... 03/05 17:23
pracinverse:THANKS 03/05 22:25
pracinverse:消化中 03/05 22:25
willhunting:在有效能考量時用string不是好作法,那時用2較佳 03/06 10:17
littleshan:有效能考量的時候應該實作自己的string class 03/06 12:24