• <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 攀升 閱讀(2511) 評論(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国产精品一区二区| 国产呻吟久久久久久久92| 亚洲AV日韩精品久久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久青青草原精品影院| 无码精品久久一区二区三区| 91精品国产91久久久久福利| 久久精品免费全国观看国产| 久久亚洲国产精品一区二区| 久久久久se色偷偷亚洲精品av| 伊人久久综在合线亚洲2019 | 久久精品一区二区国产| 国产成人精品综合久久久| 久久综合视频网站| 国产精品九九久久免费视频 | 久久久久久亚洲精品无码| 精品久久久久久亚洲| 色妞色综合久久夜夜| 一本色道久久88综合日韩精品| 国产精品亚洲美女久久久| 99久久免费国产精品热| 久久久久亚洲Av无码专| 亚洲AV日韩精品久久久久| 久久久久久国产精品无码下载| 久久久中文字幕日本| 久久久久亚洲爆乳少妇无| 国产精品免费看久久久香蕉| 久久九九亚洲精品| 91久久精品电影| 久久久久久无码国产精品中文字幕| 99久久精品免费观看国产| 精品乱码久久久久久夜夜嗨| 狠狠色综合久久久久尤物| 久久久久99精品成人片三人毛片| 久久久网中文字幕| 久久精品国产色蜜蜜麻豆|