• <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è)原文鏈接也好
            久久ZYZ资源站无码中文动漫| 99久久国产亚洲高清观看2024 | 久久这里只有精品久久| 狠狠色丁香久久综合五月| 久久91精品久久91综合| 久久激情亚洲精品无码?V| 久久亚洲AV成人无码| 99久久精品国产一区二区| 国内精品久久久久久久久电影网 | 日本一区精品久久久久影院| 亚洲国产婷婷香蕉久久久久久| 久久精品a亚洲国产v高清不卡| 久久久91人妻无码精品蜜桃HD| 亚洲女久久久噜噜噜熟女| 久久久国产精华液| 精品国产VA久久久久久久冰| 热99RE久久精品这里都是精品免费 | 久久福利片| 国产精品久久成人影院| 久久WWW免费人成一看片| 久久久精品久久久久特色影视| 久久久久久久综合日本亚洲| 久久这里只有精品18| 伊人久久大香线蕉综合Av| 伊人色综合久久天天网| 久久精品国产亚洲AV不卡| 色综合色天天久久婷婷基地| 国产亚洲精品美女久久久| 久久久一本精品99久久精品88| 人妻无码精品久久亚瑟影视| 久久一区二区免费播放| 久久人人爽人爽人人爽av| 久久久久婷婷| 日本欧美国产精品第一页久久| 国内精品久久久久久久久电影网| 久久91亚洲人成电影网站| 东京热TOKYO综合久久精品| 国产精品青草久久久久婷婷| 久久精品国产精品青草app| 精品熟女少妇aⅴ免费久久| 亚洲第一永久AV网站久久精品男人的天堂AV|