• <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減減
            亚洲中文久久精品无码| 欧美日韩精品久久久免费观看| 午夜精品久久久久久中宇| 久久精品国产亚洲AV蜜臀色欲 | 欧美牲交A欧牲交aⅴ久久 | 人妻无码αv中文字幕久久琪琪布| 久久精品亚洲日本波多野结衣| 伊人久久大香线蕉精品| 国产免费久久精品99re丫y| 久久九九精品99国产精品| 久久久精品视频免费观看 | 久久精品国产亚洲AV香蕉| 四虎国产精品免费久久5151| 无码人妻久久一区二区三区蜜桃| 久久久无码精品亚洲日韩按摩 | 日日狠狠久久偷偷色综合0| 麻豆成人久久精品二区三区免费 | 久久亚洲中文字幕精品有坂深雪| 国产激情久久久久影院小草 | 久久国产精品-久久精品| 久久天天躁狠狠躁夜夜2020老熟妇| 亚洲精品国产字幕久久不卡| 久久97久久97精品免视看秋霞| 欧美丰满熟妇BBB久久久| 午夜精品久久久久久影视777 | 久久久久女教师免费一区| 久久精品亚洲精品国产色婷 | 亚洲国产成人久久精品99| jizzjizz国产精品久久| 久久99久国产麻精品66| 亚洲精品国产自在久久| 久久久久国产日韩精品网站| 四虎国产精品免费久久5151| 996久久国产精品线观看| 精品少妇人妻av无码久久| 婷婷久久久亚洲欧洲日产国码AV| 一本综合久久国产二区| 久久久久久亚洲精品影院| 超级97碰碰碰碰久久久久最新| 欧美久久一区二区三区| 亚洲国产精品嫩草影院久久|