@小明
為模式而模式當(dāng)然不對,但是很多時(shí)候你會不自覺地用到設(shè)計(jì)模式,因?yàn)橥悊栴}已經(jīng)有了一種被大家證明是最合理的方案(模式)來解決。
上面的問題你有更好的解決方案嗎?
@sharkcc
涉及到很多模式, Template, Decorate, Composite, faced, Visitor等
嫌文字太多可以直接下載最后的源代碼看, 相信會有所收獲。
@飯中淹
沒太看明白你說的問題, 但是我想對于UI來說很多東西是類似的,
就一個(gè)UI(窗口)本身是一棵遞歸的樹,內(nèi)部有容器和控件,相當(dāng)于樹的分支(node)和樹葉(leaf),并且可以無限遞歸, 這個(gè)層次很符合Composite模式,也很符合用XML來描述。
所以現(xiàn)在比較流行的UI框架(比如WPF, WEB頁面)都分2層來描述,一層是標(biāo)記(markup). 比如WPF里的XAML, Web頁面里的HTML; 另外一層是代碼(code), 比如WPF里用C#, Web頁面里用javascript.
其實(shí)本質(zhì)上code部分才是真正的實(shí)現(xiàn),內(nèi)部定義了所有的控件層次, 所以即使不依賴markup部分,我們同樣可以定義和操作所有的UI, 但是借助Markup可以讓我們更方便的生成和修改UI。
至于用不用Prototype模式不太重要,我這里的想法是讓控件有默認(rèn)的風(fēng)格屬性,而且這個(gè)默認(rèn)風(fēng)格屬性也是容易修改的。通過用Prototype,我可以在XML里定義默認(rèn)的控件原型,程序初始化時(shí)用該原型來注冊控件就可以了。另外, 如果有些控件你覺得用不到,不去注冊就好了。 這種注冊機(jī)制, 對于支持插件(控件)也很方便,你覺得呢?
@10年碼農(nóng)
你說的我也明白,其實(shí)就是體力勞動和腦力勞動的差別,在中國體力不值錢,但是腦力勞動可以讓你滿足基本的生活需要外還有些閑錢。
另外,感覺國內(nèi)其實(shí)大家都過得都比較累,無論是上面的官員,還是城市的中產(chǎn)房奴,或是底層的農(nóng)民。
@Peter Wang
是的,但是人家的知識更新要慢得多。
比如古代的一個(gè)廚師,到現(xiàn)代的話只要學(xué)下怎么用煤氣灶就可以繼續(xù)干活了。
但是如果是一個(gè)DOS程序員轉(zhuǎn)換到Windows開發(fā)就不那么容易了
@CapaLin
其實(shí)任何一個(gè)稍微有點(diǎn)規(guī)模的程序,都是上述知識體系的結(jié)合,開發(fā)一個(gè)優(yōu)秀的軟件尤其如此。
依賴于編譯器的內(nèi)存布局, 不敢用。
C++11新增了array類來替代C型的原始數(shù)組。
re: C++11新特性不完全測試 Richard Wei 2012-06-07 08:35
@周星星
是的, 不好意思,寫錯(cuò)了,應(yīng)該是VS11(Visual Studio 11 Beta)
多謝指正。
re: 試論C++類庫開發(fā)之難 Richard Wei 2012-05-30 18:19
的確,C++ STL提供的都是最基本的功能,上層應(yīng)用的庫還是要自己封裝
re: MFC,一開始就錯(cuò)了 Richard Wei 2012-05-30 18:14
哈哈,恭喜,博主終于醒悟了
re: OOP的黃昏 Richard Wei 2012-05-24 21:27
在C++11中沒有看到concept, 不知博主有啥看法?
re: 桌面上嵌入窗口(桌面日歷)原理探索 Richard Wei 2012-05-19 11:22
@請教一下
沒環(huán)境,讓客戶不要裝360吧 :)
re: 桌面上嵌入窗口(桌面日歷)原理探索 Richard Wei 2012-05-19 10:41
@請教一下
好像沒有你說的半透明失效問題,可以參照我上傳的測試代碼。
至于360是否攔截,我就不知道了, 理論上這個(gè)不是安全問題,不該攔截的。
re: 如何判斷一個(gè)C++對象是否在堆上 Richard Wei 2012-05-13 09:52
@Duwen
windows NT內(nèi)核初始化時(shí)就有3個(gè)堆,且余留大小都是1MB,提交大小是8KB,其中一個(gè)是系統(tǒng)默認(rèn)堆, 我們調(diào)用GlobalAlloc(),就是在默認(rèn)堆里分配的內(nèi)存。
C/C++ CRT會創(chuàng)建自己的堆,我們平時(shí)new對象,都是在該堆里分配的內(nèi)存。所以我們一般看到的程序起碼有4個(gè)堆。
另外如果你用了COM組件(調(diào)用了::CoInitialize(NULL)), 他也會建立自己的2個(gè)堆,CoTaskMemAlloc() 和 SysAllocString()都在在里面分配的內(nèi)存。
一般寫應(yīng)用程序,理解到此就夠了,再深入就要看Windows內(nèi)核的源代碼了。
re: 如何判斷一個(gè)C++對象是否在堆上 Richard Wei 2012-05-12 23:05
@Duwen
堆棧大小一般默認(rèn)是1M,但是VC在編譯時(shí)是可以通過/STACK :reserve[,commit] 設(shè)置的
另外對象所在位置, 除了堆(Heap)和棧(Stack),還有靜態(tài)存儲區(qū)等
re: 如何判斷一個(gè)C++對象是否在堆棧上 Richard Wei 2012-05-12 22:49
@jk
有什么方法, 希望可以學(xué)習(xí)下。
re: 如何判斷一個(gè)C++對象是否在堆棧上 Richard Wei 2012-05-12 22:48
@Duwen
多謝指正,希望共同進(jìn)步。
恩,可能表達(dá)不是很清楚,我上面說的堆棧其實(shí)指的就是棧(Stack)。
至于堆(Heap), 每個(gè)進(jìn)程除了默認(rèn)堆,還有其他的, 比如C/C++ CRT就會創(chuàng)建自己的堆,我們每次new對象,默認(rèn)都是在該堆里進(jìn)行的。所以如果我們寫程序時(shí)每個(gè)模塊(DLL)用靜態(tài)方式鏈接CRT,在DLL內(nèi)new對象時(shí)都會在DLL自己的CRT堆上創(chuàng)建對象。
re: 如何判斷一個(gè)C++對象是否在堆棧上 Richard Wei 2012-05-12 14:31
re: QQ截圖時(shí)窗口自動識別的原理 Richard Wei 2012-05-07 16:03
更正下,用工具看了下QQ截圖時(shí)的全屏窗口,發(fā)現(xiàn)它沒有WS_EX_LAYERED屬性,也沒有WS_DISABLED屬性,所以QQ截圖在獲取最外層Popup窗口時(shí)應(yīng)該不是用ChildWindowFromPointEx獲取的。 而應(yīng)該是通過Z-Order從上到下枚舉(EnumWindows)所有可見并且非Transparent的Popup窗口, 這樣他們可以過濾掉自己的全屏窗口,找到第一個(gè)鼠標(biāo)所在位置的Popup窗口,然后再用ChildWindowFromPointEx獲取里面的子窗口。
@ithaca
不好意思,有點(diǎn)誤導(dǎo),應(yīng)該是這本書,
《提高C++性能的編程技術(shù)》
@zgpxgame
是的,適用經(jīng)常分配和釋放的同一類型的對象。
可變對象大小的內(nèi)存池還要復(fù)雜的多,也沒有很通用的解決方案。
@jk
不錯(cuò),我一直用自己寫的。
看來我落伍了,抓緊去學(xué)一下
@陳梓瀚(vczh)
不錯(cuò), Boost的Shared_ptr功能更強(qiáng)大,但是很多公司不讓用。