看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vs2008 + xp 問題(Question): 這二篇剛問完 #1DDQ0bvS #1DDQrPaA , 鑽牛角的壞習慣又跑出來了... com 元件的初始化只能初始一次, 如果我想包 class,不讓其它的設計者管理 ConInitialize 與 CoUninitialize 的話該怎麼做? 目前想像的 class 大概長得像這樣 class wall{ static bool init public: wall(){ if(!init) { CoInitialize(NULL); // 這個只能用一次 init = true; } } } 這樣會遇到 3 個問題 1. 直接用 if(!init),第一次執行時,init 會不會判別成 unknow ? 還是用 static bool init 時就初始化成 false ? 2. CoUninitialize(); 是程式結束時要做的事,也只要執行一次, 如果放在解構子裡面的話,多個物件解構發生時就重覆執行了, 有辦法讓它只執行一次嗎? 3. 如果有多個 class (class A, B, C),它們全都沒有任何關係, 但他們都要調用 com ,這樣就不適用每個 class 都有一份自己的 init 在不考慮繼承、全域變數下,是否有辦法讓 CoInitialize、CoUninitialize 只跑一次? 還是說,只能讓其它的 user 自己去呼叫 CoInitialize、CoUninitialize, 這個動作不能(或不好)放在 class 裡? (單純想知道如果要放的話該怎麼放?) 補充說明(Supplement): 謝謝各位先進指教,感激不盡 !! -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.142
loveme00835:獨體模式 01/18 23:58
tropical72:獨體模式的實做也就是用全域變數吧? 01/18 23:59
loveme00835:http://ppt.cc/l!AM 建構子放你想要呼叫的函式, 也可 01/19 00:08
loveme00835:以提供 clone() 來得到多個實體 01/19 00:09
loveme00835:這樣子? http://codepad.org/JEfe6oNh 01/19 00:26
其實看到您給的第一個連結我就有點 confuse 了 裡面是說要把建構子用 private 宣告, 可能是 java 的關係,所以我以為 java 可以指定建構子的權限(不會java XD) 然而您 po 的第二段連結發現,那個 Lock 建構子也不是放在 public 底下的 是我會錯意了嗎? 另想請教 照您的寫法,只要把那個 namespace 放到我的 header 裡面, 其它的 calss 也完全不用去管 com 有沒有初始化、釋放的問題吧? 另不知這方面是否有參考書籍?(Primer 念了大半似乎沒什麼印象..) 最後謝謝您的細心指教,感謝!! ※ 編輯: tropical72 來自: 180.177.76.142 (01/19 00:36)
loveme00835:呼叫錯了... XD 01/19 00:36
loveme00835:設成 private 的用意在不想讓別人建構此類的物件, 如 01/19 00:38
loveme00835:果建構子有一些重要的初始化動作, 也可以比較好管理, 01/19 00:40
tropical72:所以建構子可以放在private,只是不能建立實體物件? 01/19 00:40
loveme00835:因為 static 物件快要跟整個程式生命週期一樣長, 所以 01/19 00:40
tropical72:應該是說在主程式應面不能建立實體物件? 01/19 00:41
loveme00835:就像你說的不用擔心初始化、釋放的問題, 當然可以放在 01/19 00:41
loveme00835:private區段呀~ 除了 Lock 本身的成員函式(靜態/非靜) 01/19 00:42
loveme00835:還有friends, 其他地方都不准用 01/19 00:42
tropical72:非常感謝您的細心解說,這部份總算懂了,再次感謝!! 01/19 00:44
tropical72:最後一個問題,這方法在多行緒方面有要再特別注意的嗎? 01/19 00:46
loveme00835:如果說書的話...其實看完GoF的Designed Patterns, 剩 01/19 00:48
littleshan:要,多緒的話你會死得很難看 01/19 00:49
loveme00835:下就是看你想不想得到要把它套上來, 我是不知道 COM的 01/19 00:49
littleshan:請參考modern c++ design有一章在講singleton 01/19 00:49
VictorTom:l大一出場就氣勢驚人....XD 01/19 00:50
tropical72:非常感謝 loveme00835 與 littleshan指導,我受益良多 01/19 00:50
loveme00835:原理, 不過你要注意每個緒程執行的時間 01/19 00:51
loveme00835:littleshan 大說的在 6.9 01/19 00:55
loveme00835:不過想一想, 我是在主緒建立一個特別的物件(只是為了 01/19 00:57
loveme00835:呼叫某些函式), 並不是為了存取之用, 多緒應該還好 01/19 00:58
tropical72:再次感謝 :) 01/19 00:59
Chikei:可以參考stlsoft裡面的comstl initialiser看看 01/19 16:39