• <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>

            攀升·Uranus


            Something Different,Something New
            數據加載中……

            可以根據字符串創建類嗎--解決方案 熟練c/c++(六)

            想了很久,結合c++設計新思維的方法,大家這種設計會有什么問題?


            -----------IShape.h-----------------
            class IShape
            {
            public:
             IShape()
             {
              printf("\n IShape\n");
             }
             virtual ~IShape()
             {
              printf("\n ~IShape\n");
             }
             virtual void Draw() = 0;
            };

            typedef const char* ShapeType;
            typedef IShape* (*Creator)();


            ------------ShapeFactory.h--------------------

            class ShapeFactory {
            public:
                static ShapeFactory& Instance() {
                    static ShapeFactory instance;
                    return instance;
                }

                IShape* Create(ShapeType shapeType);
                bool RegisterShape(ShapeType shapeType, Creator creator);

            private:
                ShapeFactory() {}
             std::map<ShapeType, Creator> shapeCreators;
            };

            ------------ShapeFactory.cpp--------------------

            #include "CFactory.h"

            IShape* ShapeFactory::Create(ShapeType shapeType) {
                  Creator creator = shapeCreators.find( shapeType )->second;
             
                  if ( creator == NULL ) 
                  { 
                       return NULL; 
                   }
                   return creator();
            }

            bool ShapeFactory::RegisterShape( ShapeType shapeType, Creator creator ) {
                   map<ShapeType, Creator>::iterator iter;
                   iter = shapeCreators.find(shapeType);
                   if(iter != shapeCreators.end())
                   {
                       return false;
                   } else {
                       shapeCreators[shapeType] = creator;
                       return true;
                }
            }

            ------------CCircle .h--------------------
            #include<stdio.h>

            #include "IShape.h"
            #include "CFactory.h"
            class CCircle : public IShape
            {
            public:
             CCircle()
             {
              printf("\n CCircle\n");
             }
             virtual ~CCircle()
             {
              printf("\n ~CCircle\n");
             }

             virtual void Draw();
            };


            ------------CCircle .cpp--------------------
            #include "CCircle.h"

            IShape* Create() { return new CCircle(); }
            static const bool RegisterShape__ = ShapeFactory::Instance().RegisterShape( "CCircle", Create);

            void CCircle::Draw()
            {
             printf("\n CCircle::Draw\n");
            }


            ------------main.cpp--------------------
            #include<stdio.h>
            #include"CFactory.h"

            #include "IShape.h"

            int main() {
                IShape* line = ShapeFactory::Instance().Create("CCircle");
                line->Draw();    
                return 0;
            }

            有點小小的興奮,大家積極發言喲?。?!

            主要參考: http://blog.csdn.net/jicao/archive/2006/07/01/861343.aspx 
                                 http://blog.csdn.net/hjsunj/archive/2008/01/07/2028597.aspx
                                 《c++設計新思維》

            posted on 2009-01-12 22:29 攀升 閱讀(2509) 評論(28)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            建議先看看mfc的dynamicCreate,
            里面的宏很好用啊
            2009-01-12 23:44 | 夜弓

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            與動態語言有何異
            2009-01-13 04:34 | bug

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            Gems5 里面有篇關于組件的文章也是講這個思想的,可以看看~~
            2009-01-13 09:10 | 飄飄白云

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            孺子可教
            抄的不錯
            2009-01-13 09:32 | cj

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            這個方法也是不錯的??!

            很不錯@
            2009-01-13 11:26 | 夢在天涯

            # re: 可以根據字符串創建類嗎--解決方案 [未登錄]  回復  更多評論   

            不錯,很好的思路。
            樓上各位需要明白下 空杯心理。
            2009-01-13 11:41 | cppexplore

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            結果還是用了一個Map嘛……都說了,只能這樣。

            兩個月前我實現了一個簡單的serialization,其中就有一個這樣的功能。這幾天決定重寫。
            2009-01-13 12:43 | 陳梓瀚(vczh)

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            原來你的需求是這樣的,一般的工廠模式解決的就是這個問題。
            2009-01-13 13:31 | eXile

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @夜弓
            據我同事說那個實現起來很復雜,所以我一直沒有看
            2009-01-13 13:36 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @bug
            就是用C++實現類似JAVA里面的類似反射機制,
            就是我寫的太搓了
            2009-01-13 13:37 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            那這個IShape把所有的接口都設計好了,按名創建就行了。
            這用不到RTTI。
            所謂反射應該是這樣的,有一個公共類Object, 使用如下:
            Object* object = createByName(“Circle”);
            object->invoke("draw");
            2009-01-13 13:40 | eXile

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @飄飄白云
            不好意思,我是搞嵌入式開發的,指教下你這個Gems5是什么技術?
            2009-01-13 13:40 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @cj

            呵呵,學習學習,謝謝你的指點。
            2009-01-13 13:42 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @夢在天涯
            謝謝老大的支持,我會更加努力!!!!
            2009-01-13 13:43 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @cppexplore
            謝謝,共同交流.
            2009-01-13 13:48 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @陳梓瀚(vczh)
            是的,這個思想主要是static初始化時會自動執行注冊
            2009-01-13 13:56 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @eXile
            好像是不行吧,
            2009-01-13 14:02 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            我靠!這個博客寫得太好了!
            2009-01-13 20:20 | PITHY LU

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @PITHY LU
            我靠,這是誰呀,贊美還是諷刺呀??
            2009-01-13 20:23 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @攀升
            不是特別復雜來著~
            2009-01-14 09:40 | 夜弓

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            兄弟們,不要高興太早!
            我是原作者,當然知道有什么漏洞。
            請注意線程安全。
            靜態函數的方法也是無奈之舉,要完整的需要考慮線程安全。
            2009-01-14 12:26 | cj

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            攀升:麻煩你在文章里給出我的原文鏈接。我有詳細的解釋,便于大家閱讀。
            2009-01-14 12:30 | cj

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @cj
            我找了找,應該是參考這個文章的和c++新思維上的代碼,請問這是你的原文嗎:
            http://blog.csdn.net/hjsunj/archive/2008/01/07/2028597.aspx

            如果不是,請給出你的文章地址,我再學習學習!

            這些代碼不都是c++新思維上的代碼嗎?
            2009-01-14 12:46 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            RE:
            @飄飄白云
            不好意思,我是搞嵌入式開發的,指教下你這個Gems5是什么技術?

            《Game programming Gems5》中1.3節“基于組件的對象管理”,里面的解決方案與你上面的解決方案很類同的,呵呵,當然你的要簡單清晰些~~
            2009-01-14 21:45 | 飄飄白云

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @飄飄白云
            好的,我知道了,看來主體思想還是基于組件的對象管理
            2009-01-15 10:26 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            原文在
            http://blog.csdn.net/jicao/archive/2006/07/01/861343.aspx

            hjsunj說注冊部分用宏實現。其實這是各人的喜好,沒有本質的區別。
            http://blog.csdn.net/hjsunj/archive/2008/01/07/2028597.aspx

            Loki當然也可以做,但那是一把牛刀。用那個自己決定。
            2009-01-15 12:06 | cj

            # re: 可以根據字符串創建類嗎--解決方案   回復  更多評論   

            @cj

            謝謝您的鏈接
            2009-01-15 23:04 | 攀升

            # re: 可以根據字符串創建類嗎--解決方案 熟練c/c++(六)  回復  更多評論   

            加個原文鏈接也好
            2009-02-27 12:40 | 不是原創啊?RP減減
            蜜臀久久99精品久久久久久小说| 老司机午夜网站国内精品久久久久久久久| 久久久久亚洲国产| 伊人久久五月天| 精品国产99久久久久久麻豆| 无码国内精品久久人妻| 曰曰摸天天摸人人看久久久| 色婷婷噜噜久久国产精品12p| 色狠狠久久AV五月综合| 国产成人久久精品一区二区三区| 激情综合色综合久久综合| 97精品依人久久久大香线蕉97| 久久精品国产第一区二区三区| 国产真实乱对白精彩久久| 伊人久久综合成人网| 青青草国产精品久久| 久久亚洲精品无码aⅴ大香| 久久综合九色综合97_久久久| 亚洲综合精品香蕉久久网| 国产精品美女久久久久网| 国内精品九九久久精品| 亚洲国产成人久久一区WWW| AA级片免费看视频久久| 99久久人妻无码精品系列| 思思久久99热只有频精品66| 国产精品va久久久久久久| 999久久久免费精品国产| 亚洲中文字幕无码久久2020| 思思久久99热只有频精品66| 久久精品国产亚洲AV不卡| 狠狠色伊人久久精品综合网 | 香蕉久久久久久狠狠色| 国产精品久久午夜夜伦鲁鲁| 日本强好片久久久久久AAA| 无码人妻精品一区二区三区久久| 中文字幕热久久久久久久| 久久久久久久亚洲精品| 狠狠久久综合伊人不卡| 久久精品无码av| 久久久久久国产精品无码下载 | 日本精品久久久久中文字幕 |