Re: [問題] 開function給別人用遇到的問題

看板C_and_CPP作者 (我要加入劍道社!)時間12年前 (2012/03/04 13:22), 編輯推噓3(308)
留言11則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《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

03/04 13:55, , 1F
Q2指的是Decorator?
03/04 13:55, 1F

03/04 13:58, , 2F
03/04 13:58, 2F

03/04 14:06, , 3F
No 這不是 decorator
03/04 14:06, 3F

03/04 14:17, , 4F
這用decorator好像也ok,還是會有什麼比較不好的?
03/04 14:17, 4F

03/05 15:52, , 5F
一般decorator回傳的是同一物件 也沒有順序
03/05 15:52, 5F

03/05 17:15, , 6F
我覺得他想包的是純 C 的 library
03/05 17:15, 6F

03/05 17:23, , 7F
decorator包裝的順序就是要執行的順序啊...
03/05 17:23, 7F

03/05 22:25, , 8F
THANKS
03/05 22:25, 8F

03/05 22:25, , 9F
消化中
03/05 22:25, 9F

03/06 10:17, , 10F
在有效能考量時用string不是好作法,那時用2較佳
03/06 10:17, 10F

03/06 12:24, , 11F
有效能考量的時候應該實作自己的string class
03/06 12:24, 11F
文章代碼(AID): #1FKlmG6q (C_and_CPP)
文章代碼(AID): #1FKlmG6q (C_and_CPP)