• <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
            數(shù)據(jù)加載中……

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

            想了很久,結(jié)合c++設(shè)計(jì)新思維的方法,大家這種設(shè)計(jì)會(huì)有什么問題?


            -----------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;
            }

            有點(diǎn)小小的興奮,大家積極發(fā)言喲!!!

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

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

            評(píng)論

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            與動(dòng)態(tài)語言有何異
            2009-01-13 04:34 | bug

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            這個(gè)方法也是不錯(cuò)的啊!

            很不錯(cuò)@
            2009-01-13 11:26 | 夢(mèng)在天涯

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案 [未登錄]  回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            結(jié)果還是用了一個(gè)Map嘛……都說了,只能這樣。

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            @夜弓
            據(jù)我同事說那個(gè)實(shí)現(xiàn)起來很復(fù)雜,所以我一直沒有看
            2009-01-13 13:36 | 攀升

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            @bug
            就是用C++實(shí)現(xiàn)類似JAVA里面的類似反射機(jī)制,
            就是我寫的太搓了
            2009-01-13 13:37 | 攀升

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            @cj

            呵呵,學(xué)習(xí)學(xué)習(xí),謝謝你的指點(diǎn)。
            2009-01-13 13:42 | 攀升

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            @陳梓瀚(vczh)
            是的,這個(gè)思想主要是static初始化時(shí)會(huì)自動(dòng)執(zhí)行注冊(cè)
            2009-01-13 13:56 | 攀升

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            如果不是,請(qǐng)給出你的文章地址,我再學(xué)習(xí)學(xué)習(xí)!

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

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

            hjsunj說注冊(cè)部分用宏實(shí)現(xiàn)。其實(shí)這是各人的喜好,沒有本質(zhì)的區(qū)別。
            http://blog.csdn.net/hjsunj/archive/2008/01/07/2028597.aspx

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

            # re: 可以根據(jù)字符串創(chuàng)建類嗎--解決方案   回復(fù)  更多評(píng)論   

            @cj

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

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

            加個(gè)原文鏈接也好
            国产成人久久精品区一区二区| 亚洲国产精品一区二区久久| 久久亚洲国产精品五月天婷| 国产精品99久久久久久宅男小说| 精品无码久久久久国产动漫3d| 精品无码久久久久久午夜| 亚洲嫩草影院久久精品| 中文字幕热久久久久久久| 性欧美丰满熟妇XXXX性久久久| 国産精品久久久久久久| 久久精品国产精品亚洲毛片| 亚洲欧洲久久久精品| 色综合久久中文色婷婷| 亚洲av成人无码久久精品| 亚洲Av无码国产情品久久| 亚洲国产精品一区二区久久| 久久99国产精品尤物| 久久久久av无码免费网| 武侠古典久久婷婷狼人伊人| 久久中文娱乐网| 国产精品久久久天天影视| 亚洲va中文字幕无码久久| 亚洲精品NV久久久久久久久久| 精品国产乱码久久久久久浪潮| 99re这里只有精品热久久| 综合久久国产九一剧情麻豆| 亚洲国产成人久久笫一页| 久久久久久噜噜精品免费直播 | 久久久噜噜噜久久熟女AA片 | 97r久久精品国产99国产精| 久久无码AV中文出轨人妻| 香蕉久久AⅤ一区二区三区| 久久亚洲国产成人影院网站| 久久精品国产亚洲7777| 开心久久婷婷综合中文字幕| 国产精品欧美亚洲韩国日本久久| 91精品国产色综久久| 精品国产综合区久久久久久| 久久久WWW成人| AV无码久久久久不卡蜜桃| 欧美精品国产综合久久|