作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 開function給別人用遇到的問題
時間Sun Mar 4 13:22:21 2012
※ 引述《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
→ 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