青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OnTheWay2012
埋葬昨天的我,迎來重生的我!
posts - 15,  comments - 89,  trackbacks - 0

        以下的類實現了一些奇怪的功能,也可以說是一些不常用的功能;先不管這些功能到底是否有用,來看看這些類是怎么實現這些功能的也是挺有趣的。
(1)請設計一個只能在堆上生存的類
        在C++中對象有三個存儲空間,靜態存儲區、堆、棧。請設計一個類,該類只能在堆上存儲。如果你是第一次看到這種要求,請先別往下看,自己先想一想。想過了嗎?是不是感覺實現這么個類有點困難?呵呵,其實這個問題如果換如下的問題的話可能更容易解答:請簡單說明一下單例模式的實現方法?大家對單例模式一般都不太陌生吧,具體代碼如下:

 

 

 1class CSingle
 2{
 3private:
 4    CSingle() 
 5    {
 6
 7    }

 8
 9    static CSingle *m_pSingle;
10
11public:
12    static CSingle* GetInstance()
13    {
14        if (NULL == m_pSingle)
15        {
16            m_pSingle = new CSingle;
17        }

18
19        return m_pSingle;
20    }

21
22}
;
23
24CSingle *CSingle::m_pSingle = NULL;

        請注意在單例模式中的類CSingle的對象是不是都是在堆上的?是不是感覺好像知道怎么回答最初的問題了?
        實現只能在堆上生存的類的具體代碼如下:

 1class COnlySurviveOnHeap
 2{
 3private:
 4 COnlySurviveOnHeap() 
 5 {
 6
 7 }

 8
 9 friend COnlySurviveOnHeap* GetInstance();
10}
;
11
12COnlySurviveOnHeap* GetInstance()
13{
14 return new COnlySurviveOnHeap;
15}

16
17

測試代碼如下:

1int main(int argv, char *argc[])
2{
3 COnlySurviveOnHeap *pOnlySurviveOnHeap = GetInstance();//right
4 COnlySurviveOnHeap object;//error
5
6 return 0;
7}

8

        是不是感覺很簡單?是不是感覺和單例模式很像?我在網上搜索了一下這個問題的解答,好多人把單例模式的代碼作為一種實現。但是單例模式的這種實現多了一個限制,那就是只能有一個對象,所以感覺不是太符合題意。

(2)請設計一個只能在棧上生存的類
        什么樣的類對象是在堆上生存的呢?那就是通過new創建的對象(不考慮使用malloc分配內存后再調用inplace new的這種方式)。是否可以考慮禁止對這個類進行new操作的方法來實現該類的設計呢?答案是當然可以了。
        具體代碼如下:

 1class COnlySurviveOnStack
 2{
 3private:
 4 void* operator new(size_t) 
 5 {
 6  assert(false);
 7  return NULL;
 8 }

 9}
;
10

測試代碼如下:

1int main(int argv, char *argc[])
2{
3 COnlySurviveOnStack *pOnlySurviveOnStack = new COnlySurviveOnStack;//error
4 COnlySurviveOnStack object;//right
5
6 return 0;
7}

8

 

(3)請設計一個類該類不能夠作為基類
        以下的內容是轉載的。向想出這種方法并且寫的這么詳細這么容易懂的大蝦致敬!我只修改了一下排版格式。
        如果大家熟悉java的話應該知道java中有一種類不能被繼承,那就是final類.這種類有很多用處,尤其是在大的項目中控制類的繼承層次。
使子類數量不至于爆炸,在使用了多繼承的類層次中這也是防止出現菱形繼承層次結構的一個好辦法,要實現一個不能被繼承的類有很多方法。如何使類不能被繼承的主要的思路就是使子類不能構造父類的部分,這樣子類就沒有辦法實例化整個子類。這樣就限制了子類的繼承。所以我們可以將父類的構造函數聲明成為私有的,但是這樣父類不就不能實例化了嗎?可以添加一個靜態幫助函數來進行構造。雖然這樣很簡陋,但是這的確是一種解決方法??墒侨绻挥羞@個方法能夠解決,那么C++實在是太不靈活了.而且這也不值得寫一片文章出來!有沒有辦法解決上面的方法中的那些問題呢?
        當然有!我們可以利用友員不能被繼承的特性! 
        首先假設已經有一個類CXX.這是某一個類層次的分支,我們現在要從CXX繼承一個Final子類CParent來,也就是CParent不能夠被繼承.   我們可以充分利用友員不能被繼承的特點,也就是說讓CParent是某一個類的友員和子類,CParent可以構造,但是CParent的子類CChild確不能繼承那個友員特性,所以不能被構造.所以我們引入一個CFinalClassMixin。
         我們對這個類的功能是這么期望的:    
         任何類從它繼承都不能被實例化同時這個類本身我們也不希望它被實例化。
          如何實現這個類那?很簡單!那就是實現一個構造函數和析構函數都是private的類就行了.同時在這類里面將我們的CParent聲明為友員.   代碼如下:    

 1class CFinalClassMixin   
 2{   
 3friend class CParent;   
 4private:   
 5 CFinalClassMixin(){}   
 6 ~CFinalClassMixin(){}   
 7}
;   
 8 
 9class CParent : public CXXX   
10{   
11public:   
12 CParent(){}   
13 ~CParent(){}   
14}

15

它是從CXXX擴展的一個類(注,此時它還是能夠被繼承).現在我們需要它不能被繼承.那么只要將代碼改成    

 

1class CParent : public CFinalClassMixin,   public CXXX   
2{   
3public:   
4 CParent(){}   
5 ~CParent(){}   
6}
;  

       就行了.現在從CParent繼承一個子類試試 。
      classCChild : public CParent { };    
      編譯一下代碼試試,發現:竟然沒有作用!!!
      現在再回想一下我們這么操作的原因,也就是這個方案的原理:那就是讓父類可以訪問Mixin類的構造函數,但是子類不能訪問?,F在看看我們的代碼,發現父類是CFinalClassMixin類的友員,可以訪問它的構造函數。因為友員不能繼承,所以CChild不能訪問CFinalClassMixin的構造函數.所以應該不能被實例化。CChild的確不能訪問CFinalClassMixin的構造函數,但是它卻不必調用它!我想這就是問題的原因所在。CChild是通過CParent來構造CFinalClassMixin的,所以這個友員對他并沒有什么用處! 現在問題找到了.要解決很簡單.只要讓CChild必須調用CFinalClassMixin的構造函數就行了,怎么才能達到目的呢? 還記得虛繼承嗎?虛繼承的一個特征就是虛基類的構造函數由最終子類負責構造!所以將CParent從CFinalClassMixin繼承改成從CFinalClassMixin虛繼承就可以了.代碼如下:  

 

1class CParent : virtual public   CFinalClassMixin, public CXXX   
2{   
3public:   
4 CParent(){}   
5 CParent(){}   
6}
;  

        現在試試,行了。但是可能有些人會對多繼承心有余悸!但是我們這里并沒有必要這么擔心!為什么?因為我們的CFinalClassMixin類是純的!pure!   也就是說它根本沒有成員變量!那么我們就根本不用擔心多繼承帶來的最大問題.菱形繼承產生的數據冗余.以及二義性?,F在還有個不足!那就是我們不能每次使用這個CFinalClassMixin類就在里面加上對某個類的友員聲明啊!這多麻煩啊!   雖然不是什么大問題,但是我覺的還是要解決,因為我充分信任C++!解決的方法也很簡單!那就是使用模板!具體描述就省略了,給出代碼大家一看就知道了。
        下面是我得測試程序的完整代碼(其中的CFinalClassmixin已經改成模板)。

 1template<class   T>   
 2class CFinalClassMixin   
 3{   
 4friend T;   
 5private:   
 6 CFinalClassMixin(){}   
 7 ~CFinalClassMixin(){}   
 8}
;  
 9 
10class CXXX   
11{   
12public:   
13 CXXX(){cout << "I am CXXX" << endl;}   
14 ~CXXX(){}   
15}
;  
16 
17class CParent : virtual public   CFinalClassMixin<CParent>public CXXX   
18{   
19public:   
20 CParent(){}   
21 ~CParent(){}   
22}
;  
23 
24class CChild : public CParent{};   
25int main(int argc, char* argv[])   
26{   
27 CParent   a;   //   可以構造   
28 //CChild   b;   //不能構造   
29 return   0;   
30}
   
31
32

        現在只要對不想被繼承的類加入一個CFinalClassMixin混合類做父類就行了。通過限制構造函數,我們就達到了限制繼承的目的。但是這對有些還是個例外,比如全是靜態函數的類.這些類本身就不需要構造。所以我們對它沒有辦法.但是在大多數情況下,一個全是靜態函數的類多少暗示了程序本身的設計可能是需要斟酌的其實這只是Mixin類(混合類)使用的一個小小例子.還有很多其他的用處,比如UnCopiale等等.就不多說了。我想說明的是大家可能對多繼承比較反感。但是過分否定也是得不償失的?,F在對多繼承到底應不應該使用還處在爭論階段。我覺得一個方法是否使用得當,關鍵還是在于使用的人。
        歡迎各位高手批評指正!

posted on 2010-05-20 19:38 OnTheWay 閱讀(1550) 評論(1)  編輯 收藏 引用 所屬分類: C、C++

<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

友情連接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合色影院| 欧美日韩精品国产| 欧美中文字幕第一页| 国产亚洲精品aa午夜观看| 久久精品理论片| 亚洲黄色免费网站| 亚洲精品在线观| 国产日本欧美一区二区三区在线 | 久久九九电影| 亚洲高清久久| 久久久久久久999精品视频| 99视频一区二区三区| 一区二区三区亚洲| 国产视频在线一区二区| 国产精品久久久久久久电影| 欧美精品www| 欧美成人午夜激情| 久久精品99国产精品| 亚洲一区二区在线播放| 欧美成人午夜激情视频| 玖玖在线精品| 免费在线国产精品| 久久精品99国产精品酒店日本| 亚洲无线一线二线三线区别av| 亚洲精品一区二区网址| 亚洲国产综合在线| 91久久久久久久久| 亚洲精品乱码久久久久久蜜桃麻豆| 在线看片第一页欧美| 国内精品免费在线观看| 合欧美一区二区三区| 黑丝一区二区| 亚洲精品一区二区网址| 亚洲一级黄色片| 久久国产精品久久w女人spa| 久久久久久久久久久久久9999 | 国产婷婷一区二区| 亚洲电影在线看| 99re6这里只有精品视频在线观看| 亚洲一区二区三区四区中文| 久久久噜噜噜| 亚洲国产精品热久久| 制服丝袜亚洲播放| 久久久伊人欧美| 欧美午夜精品久久久久久超碰| 国产日韩av在线播放| 亚洲电影免费| 亚洲一区二区综合| 女女同性女同一区二区三区91| 亚洲国产精品久久久久秋霞影院| 亚洲午夜精品一区二区| 久久婷婷av| 国产日韩精品久久久| 亚洲精品一区中文| 久久成人免费网| 一区二区三区四区蜜桃| 你懂的视频欧美| 精品1区2区3区4区| 久久久www成人免费精品| 一卡二卡3卡四卡高清精品视频| 久久综合九色综合欧美就去吻| 伊人久久久大香线蕉综合直播| 亚洲欧美日韩一区二区| 在线视频欧美日韩| 欧美日韩一区二区高清| 99pao成人国产永久免费视频| 亚洲国产欧美在线人成| 欧美v亚洲v综合ⅴ国产v| 亚洲精品久久久久| 鲁鲁狠狠狠7777一区二区| 西瓜成人精品人成网站| 国产精品视频xxx| 久久久久国产免费免费| 午夜精品久久久久久久久久久 | 亚洲精品日韩精品| 欧美精品在线观看| 在线一区二区三区四区| 在线视频精品| 在线高清一区| 亚洲人成网站在线播| 欧美日韩三区| 欧美在线视频免费观看| 久久国产精品一区二区三区| 亚洲第一中文字幕| 亚洲美女在线国产| 国产精品久久久一区二区| 久久在线视频| 欧美肉体xxxx裸体137大胆| 性做久久久久久| 久久av在线看| 一道本一区二区| 久久久久.com| 久久国产精品久久久| 国产精品99久久99久久久二8| 亚洲一区二区免费视频| 在线日韩日本国产亚洲| 这里是久久伊人| 亚洲精品一级| 久久尤物视频| 免费看的黄色欧美网站| 国产日韩欧美视频| 中文在线资源观看视频网站免费不卡| 狠狠色狠狠色综合人人| 欧美亚洲一区二区在线| 亚洲免费人成在线视频观看| 欧美美女喷水视频| 欧美激情中文不卡| 亚洲国产老妈| 久久久久久久久伊人| 久久久久久网| 国内视频一区| 美女999久久久精品视频| 欧美成人精品在线播放| 亚洲国产精品久久91精品| 欧美一二三区在线观看| 麻豆91精品| 亚洲精品乱码久久久久久黑人| 久久久久一区二区三区四区| 老司机一区二区三区| 国内在线观看一区二区三区| 久久精品人人做人人爽电影蜜月| 久久精品夜色噜噜亚洲a∨| 黄色成人av网| 欧美黄色aa电影| 亚洲线精品一区二区三区八戒| 亚洲一区视频| 一区二区三区在线观看欧美| 久久久久久久999| 亚洲欧洲中文日韩久久av乱码| 国产精品99久久99久久久二8| 国产精品久久久久久久久久直播| 久久国产精品久久久久久电车| 欧美高清影院| 性欧美1819sex性高清| 在线色欧美三级视频| 欧美色播在线播放| 麻豆国产va免费精品高清在线| 亚洲视频免费在线观看| 亚洲高清在线精品| 久久一二三四| 午夜精品偷拍| 亚洲欧洲日韩在线| 亚洲激情专区| 亚洲精品乱码久久久久| 伊人久久久大香线蕉综合直播| 国产精品v一区二区三区| 免费不卡在线视频| 久久亚洲一区二区| 欧美在线999| 香蕉久久国产| 久久精品国产99国产精品| aaa亚洲精品一二三区| 亚洲福利视频网| 嫩草伊人久久精品少妇av杨幂| 久久国产福利| 久久精品欧美| 另类春色校园亚洲| 久久久久国产一区二区| 久久永久免费| 亚洲国产乱码最新视频| 亚洲福利视频一区二区| 亚洲经典视频在线观看| 日韩一区二区精品葵司在线| 日韩一区二区久久| 久久精品国产久精国产一老狼| 欧美一区二区高清| 欧美aⅴ一区二区三区视频| 欧美日韩无遮挡| 国产亚洲成av人在线观看导航 | 一区二区三区欧美成人| 午夜精品久久久| 噜噜噜噜噜久久久久久91| 欧美日韩一区二区在线视频| 欧美日韩精品福利| 国产日韩精品一区二区三区| 亚洲第一在线综合网站| 夜夜嗨一区二区| 久久www免费人成看片高清| 亚洲成人自拍视频| 久久狠狠亚洲综合| 国产精品久久国产精品99gif| 在线激情影院一区| 午夜精品剧场| 一区二区三区回区在观看免费视频| 久久精品系列| 国产欧美大片| 亚洲欧美日韩在线观看a三区| 亚洲国产欧美日韩精品| 久久综合色88| 国内一区二区三区在线视频| 欧美一区二区三区免费在线看| 一本色道久久综合亚洲精品高清| 久久人体大胆视频| 亚洲黄色在线看| 欧美不卡激情三级在线观看| 久久久久久网| 一区精品久久| 久久人体大胆视频| 欧美在线观看视频一区二区三区 | 亚洲摸下面视频|