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

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!   也就是說它根本沒有成員變量!那么我們就根本不用擔心多繼承帶來的最大問題.菱形繼承產生的數據冗余.以及二義性。現在還有個不足!那就是我們不能每次使用這個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 閱讀(1539) 評論(1)  編輯 收藏 引用 所屬分類: C、C++

<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(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>
            欧美不卡视频一区| 狠狠干成人综合网| 亚洲激情欧美| 久久夜色精品国产噜噜av| 亚洲视频综合| 国产精品日日摸夜夜添夜夜av| 亚洲欧洲一区二区三区在线观看| 另类欧美日韩国产在线| 欧美一级一区| 激情丁香综合| 美女精品视频一区| 久久久久综合一区二区三区| 国产亚洲一区二区精品| 久久精品国产69国产精品亚洲| 亚洲一区二区高清| 国产一区二区三区丝袜| 久久亚裔精品欧美| 久久久久成人精品免费播放动漫| 国产酒店精品激情| 久久久青草青青国产亚洲免观| 久久久久久午夜| 亚洲人人精品| 亚洲另类自拍| 国产精品美女久久久久久2018| 久久精品国产成人| 精品福利电影| 亚洲欧洲日韩在线| 欧美 日韩 国产精品免费观看| 久久精品国产亚洲一区二区三区| 国产欧美日韩综合一区在线播放 | 午夜免费日韩视频| 激情欧美日韩| 亚洲国产91精品在线观看| 欧美bbbxxxxx| 亚洲综合999| 久久久久久久综合色一本| 99re6这里只有精品视频在线观看| 亚洲精品一二区| 国产精品久久久免费| 麻豆av一区二区三区| 欧美日本韩国在线| 欧美专区在线观看| 免费不卡亚洲欧美| 亚洲欧美日韩国产| 久久久久久久网| 亚洲欧美一区二区三区久久 | 日韩视频在线观看免费| 亚洲一区在线观看视频| 亚洲福利视频专区| 亚洲欧美成人网| 日韩小视频在线观看专区| 欧美一级播放| 亚洲一区二区三区三| 久久免费视频网| 欧美亚洲尤物久久| 欧美高清视频一区二区| 久久精品视频在线播放| 欧美日韩视频在线观看一区二区三区| 久久人体大胆视频| 欧美吻胸吃奶大尺度电影| 毛片基地黄久久久久久天堂| 国产精品久久一区主播| 亚洲精品色图| 亚洲免费av片| 欧美成人自拍视频| 久久亚洲视频| 国产精品午夜在线观看| 日韩视频一区二区三区在线播放免费观看| 久久婷婷国产综合精品青草| 欧美一区网站| 国产精品久久亚洲7777| 宅男噜噜噜66一区二区| 亚洲一区二区精品在线观看| 欧美国产日韩在线观看| 亚洲大片一区二区三区| 亚洲第一区在线| 久久久久久香蕉网| 欧美**人妖| 在线观看欧美日韩国产| 久久久99国产精品免费| 久久久久久91香蕉国产| 国产日韩精品视频一区| 亚洲综合色噜噜狠狠| 新狼窝色av性久久久久久| 国产精品久久久久久久久久久久久久| 欧美一区二区三区在线免费观看| 久久成人在线| 国产精品视频最多的网站| 亚洲日本中文字幕区| 亚洲欧洲精品一区二区三区| 欧美在线中文字幕| 久久在线视频| 亚洲福利久久| 久久精品99| 欧美激情一区二区久久久| 激情六月综合| 男女激情视频一区| 亚洲激情成人| 欧美一区二区三区视频| 好看的av在线不卡观看| 欧美国产日韩免费| 一区二区三欧美| 久久国产精品久久久久久| 国产一区二区三区直播精品电影 | 亚洲女同同性videoxma| 国产精品久久国产三级国电话系列 | 国产精品99一区| 亚洲精品综合| 亚洲午夜小视频| 欧美特黄视频| 欧美在线一级va免费观看| 免费日韩av片| 日韩一级在线| 国产视频在线一区二区| 久久野战av| 一区二区三区精品久久久| 久久久久久久激情视频| 日韩视频专区| 国外成人免费视频| 欧美日本不卡高清| 欧美中文在线免费| 日韩一级欧洲| 蜜臀av一级做a爰片久久| 在线亚洲精品| 欲香欲色天天天综合和网| 国产精品99一区二区| 噜噜噜久久亚洲精品国产品小说| 一本色道久久综合精品竹菊| 免费观看一区| 欧美一区二区私人影院日本 | 牛夜精品久久久久久久99黑人| 亚洲电影免费| 国产日韩精品视频一区二区三区| 欧美日韩成人综合| 久久久久久有精品国产| 亚洲深夜福利| 亚洲黄色天堂| 欧美成人小视频| 久久久91精品| 性久久久久久久久久久久| aⅴ色国产欧美| 亚洲黄色视屏| 黄色一区二区在线| 国产乱码精品一区二区三区忘忧草 | 亚洲私人影院| 亚洲国产老妈| 狠狠色伊人亚洲综合网站色| 亚洲欧美日韩一区二区在线 | 欧美日本高清| 欧美精品一区二| 欧美a一区二区| 久久综合给合| 玖玖玖免费嫩草在线影院一区| 香蕉成人伊视频在线观看| 欧美激情va永久在线播放| 久久精品视频在线| 亚洲视频一区| 一区二区三区四区五区精品视频| 亚洲精品久久| 亚洲韩国青草视频| 91久久精品国产91久久性色tv| 国外成人在线视频| 国产亚洲精品久久久久婷婷瑜伽| 国产精品久久久久天堂| 欧美日韩一区二区三区在线视频| 欧美国产乱视频| 欧美高清hd18日本| 欧美激情1区| 欧美大片18| 久久久综合网站| 久久精品一区蜜桃臀影院| 亚洲女性喷水在线观看一区| 亚洲欧美久久久| 欧美在线网址| 久久综合国产精品| 欧美激情一区| 欧美色欧美亚洲另类七区| 国产精品高潮视频| 国产精品网站视频| 国产一区二区三区免费不卡| 在线播放日韩| 亚洲精品综合| 午夜欧美电影在线观看| 女女同性精品视频| 亚洲一区高清| 欧美激情亚洲| 一区国产精品| 午夜精品久久久久久久久久久| 老司机一区二区| 亚洲视频在线观看免费| 欧美aa国产视频| 好男人免费精品视频| 午夜国产一区| 日韩午夜三级在线| 欧美18av| 激情五月婷婷综合| 香蕉久久夜色精品国产| 亚洲精品视频中文字幕| 久久久国产精品一区| 国产精品视频免费观看|