• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            #ant

            The dreams in which I'm dying are the best I've ever had...

            考慮用Macro替換Uncopyable

            看過Effective C++的人都知道,為了防止一個class被copying,而且將錯誤提前到編譯期,基本有兩種方法:
            1. 將這個類的copy構造函數和copy assignment操作符都聲明為private而且沒有定義。示例代碼如下:
            1?class?SomeClass?{
            2?
            ????...
            3?private
            :
            4?????//只有聲明

            5?????SomeClass(const?SomeClass&);
            6?????SomeClass&?operator=(const?SomeClass&
            );
            7?};

            2. 專門設計一個為了阻止copying動作而設計的base class,這個base class相當簡單:
            1?Uncopyable?{
            2?protected:?//允許derived對象構造和析構

            3?????Uncopyable()?{}
            4?????~
            Uncopyable()?{}
            5?private:?//阻止copying

            6?????Uncopyable(const?Uncopyable&);
            7?????Uncopyable&?operator=(const?Uncopyable&
            );
            8?};

            為了阻止某個對象如SomeClass被copying,我們唯一需要做的就是繼承自Uncopyable:
            1?SomeClass?:?private?Uncopyable?{
            2?
            ????...
            3?};

            第2種方案貌似很完美,在大多數情況下也工作的很好,甚至boost庫也廣泛采用了(boost庫中的叫noncopyable)。當然了,因為Uncopyable不含任何數據,符合EBO(empty base class optimization,空白基類最優化)資格,但由于它總是扮演base class,因此有可能導致多重繼承,而EBO一般只在單繼承下才可行,編譯器通常不會對有多個base class的derived classes施行EBO。

            如果你不想導致多重繼承,不管是從性能上還是書寫代碼上,比如SomeClass繼承自某個base class,你可能會寫如下代碼:
            1?class?SomeClass?:?public?BaseClass,?private?Uncopyable?{
            2?
            ????...
            3?};

            這讓人很不爽,要是你跟我一樣懶,你肯定也不會愿意采用第一種方案,因為那意味著你會在每一個不想被copying的class里都加上那三行代碼。

            如果用Macro就很簡單了,即靈活又方便:
            1?#define?CLASS_UNCOPYABLE(classname)?\
            2?????private
            :?\
            3?????classname(const?classname&
            );?\
            4?????classname&?operator=(const?classname&);

            現在SomeClass只需寫成這樣:
            1?class?SomeClass?{
            2?
            ????CLASS_UNCOPYABLE(SomeClass)
            3?
            ????...
            4?};

            不僅省事而且靈活!!!

            posted on 2007-08-27 08:11 螞蟻終結者 閱讀(2041) 評論(2)  編輯 收藏 引用 所屬分類: C++

            Feedback

            # re: 考慮用Macro替換Uncopyable 2007-08-30 15:00 haskell

            宏有時候確實很帶勁。
            不過我用noncopy類,主要是為了讓被人好看,
            至于多繼承noncopy類,概率太低  回復  更多評論   

            # re: 考慮用Macro替換Uncopyable 2008-10-28 11:48 李現民

            不錯,很好的主意  回復  更多評論   

            日日噜噜夜夜狠狠久久丁香五月| 国内精品久久久久久99蜜桃 | 久久精品国产一区| 伊人热人久久中文字幕| 超级碰久久免费公开视频| 精品久久综合1区2区3区激情| 久久精品国产一区二区三区不卡| 久久人人爽人人人人片av| 久久不射电影网| 亚洲欧美精品一区久久中文字幕| 久久777国产线看观看精品| 国产巨作麻豆欧美亚洲综合久久 | 久久激情亚洲精品无码?V| 精品国产日韩久久亚洲 | 国产日韩久久久精品影院首页| 精品久久久久久久久久中文字幕 | 伊人久久综合精品无码AV专区| 久久国产成人| 久久久久亚洲AV无码专区体验| 色天使久久综合网天天| 9999国产精品欧美久久久久久| 中文字幕精品久久久久人妻| 久久国产成人精品麻豆| 久久精品无码一区二区WWW | 久久久国产精华液| 久久国产精品偷99| 九九久久99综合一区二区| 久久久噜噜噜久久中文字幕色伊伊| 久久99国产精品久久99| 亚洲欧洲日产国码无码久久99| 欧美日韩中文字幕久久久不卡| 国产亚洲精久久久久久无码| 久久久久免费精品国产| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久久久久狠狠丁香| 久久精品国产半推半就| 久久精品国产亚洲av麻豆小说 | 26uuu久久五月天| 久久精品国产亚洲网站| 精品久久久久久国产| 国产精品久久一区二区三区 |