• <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++的人都知道,為了防止一個(gè)class被copying,而且將錯(cuò)誤提前到編譯期,基本有兩種方法:
            1. 將這個(gè)類的copy構(gòu)造函數(shù)和copy assignment操作符都聲明為private而且沒有定義。示例代碼如下:
            1?class?SomeClass?{
            2?
            ????...
            3?private
            :
            4?????//只有聲明

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

            2. 專門設(shè)計(jì)一個(gè)為了阻止copying動(dòng)作而設(shè)計(jì)的base class,這個(gè)base class相當(dāng)簡(jiǎn)單:
            1?Uncopyable?{
            2?protected:?//允許derived對(duì)象構(gòu)造和析構(gòu)

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

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

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

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

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

            這讓人很不爽,要是你跟我一樣懶,你肯定也不會(huì)愿意采用第一種方案,因?yàn)槟且馕吨銜?huì)在每一個(gè)不想被copying的class里都加上那三行代碼。

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

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

            不僅省事而且靈活!!!

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

            Feedback

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

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

            # re: 考慮用Macro替換Uncopyable 2008-10-28 11:48 李現(xiàn)民

            不錯(cuò),很好的主意  回復(fù)  更多評(píng)論   

            久久亚洲国产精品一区二区| 亚洲国产成人精品无码久久久久久综合| 久久久久久国产精品免费免费| 久久亚洲中文字幕精品一区四| 伊人久久大香线蕉精品不卡| 亚洲成色www久久网站夜月| 97久久香蕉国产线看观看| 国内精品欧美久久精品| 久久精品国产日本波多野结衣| 精品人妻久久久久久888| 久久国产精品免费一区| 久久棈精品久久久久久噜噜| 超级碰久久免费公开视频| 伊人久久五月天| 久久精品视频网| 国产美女亚洲精品久久久综合| 99热精品久久只有精品| 亚洲国产美女精品久久久久∴| 狠狠精品干练久久久无码中文字幕| 无码AV波多野结衣久久| 性做久久久久久久久浪潮| 日本福利片国产午夜久久| 亚洲va久久久噜噜噜久久狠狠 | 日产精品久久久一区二区| 国产精品久久久久一区二区三区 | 久久久久亚洲av成人无码电影 | 久久精品国产第一区二区| 无码人妻久久一区二区三区| 伊人久久大香线蕉AV一区二区| 久久99精品国产自在现线小黄鸭| 久久久久久久精品成人热色戒| 久久九色综合九色99伊人| 国产精品成人久久久久久久 | 久久久久亚洲AV无码专区首JN| 久久91这里精品国产2020| 久久久青草青青亚洲国产免观| 国产精品久久国产精品99盘 | 国内精品久久久久久久亚洲 | 久久男人中文字幕资源站| 久久精品国产精品亜洲毛片| 久久国产乱子伦精品免费午夜|