• <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)建類嗎


                     語言當(dāng)然是c++了,大家可能都碰到了,在使用工廠的時(shí)候其實(shí)還是要在某個(gè)地方寫死new A()這樣的代碼,我現(xiàn)在想根據(jù)配置文件或者其它的途徑創(chuàng)建類(類似于JAVA的反射機(jī)制);
               
                     目標(biāo)就是,新加入一個(gè)類時(shí),我不要改動(dòng)原來工廠的代碼,程序知道新加的類的名字的字符串(通過讀配置文件)。

                     各位C++大牛們想像辦法,實(shí)在不可能的話,推薦下國(guó)外有沒有這種實(shí)現(xiàn)的開源項(xiàng)目
                     謝謝了!

            posted on 2009-01-10 17:13 攀升 閱讀(2473) 評(píng)論(29)  編輯 收藏 引用

            評(píng)論

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

            C++編譯器的RTTI能力很弱。不過如果夠猛可以寫一個(gè)Front專門給各種類加RTTI就好了。
            2009-01-10 17:32 | 空明流轉(zhuǎn)

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

            @空明流轉(zhuǎn)
            是的呀,您指的front是什么類?
            2009-01-10 17:52 | 攀升

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

            純靠語言的能力是不行的,可以參考mfc的CObject實(shí)現(xiàn),使用宏來模擬
            2009-01-10 18:50 | 飄雪

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

            寫一個(gè)編譯器前段,可以給類補(bǔ)充一些代碼。
            2009-01-10 19:18 | 空明流轉(zhuǎn)

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

            語言本身沒這個(gè)機(jī)制,正如3樓說的,可以參見mfc的動(dòng)態(tài)創(chuàng)建。。。
            2009-01-10 19:45 | dophi

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

            我寫了一個(gè)宏,過會(huì)放上來讓大家批判批判
            2009-01-10 20:00 | 攀升

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

            這個(gè)應(yīng)該不難吧
            2009-01-10 20:55 | 5748

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

            ACDK這個(gè)庫可以,不過比較大,使用C++語言按照java語言規(guī)范來實(shí)現(xiàn)的基礎(chǔ)庫。不過如果走到這一步,大可不比使用C++了。
            2009-01-10 20:59 | 萬連文

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

            Nebula3里的類就有這個(gè)特性
            http://blog.csdn.net/xoyojank/archive/2008/07/03/2608400.aspx
            具體見SDK源碼
            2009-01-10 23:21 | xoyojank

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

            自己構(gòu)造一個(gè)object 類 然后作一套繼承的東西。。 可以看看qt的實(shí)現(xiàn)。
            2009-01-10 23:36 | kong

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

            最簡(jiǎn)單的辦法

            A* CreateA(){return new A();}
            B* CreateB(){return new B();}

            CreatorMap Map;
            Map.Add("A",CreateA());
            Map.Add("B",CreateB());

            -------------------------------

            A* b=Map.Create("A");
            B* b=Map.Create("B");

            -------------------------------

            如果你熟悉模板的話,可以實(shí)現(xiàn)的更漂亮一點(diǎn)。
            2009-01-11 00:55 | 陳梓瀚(vczh)

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

            贊同3樓和5樓。移植MFC的RTTI并不難。
            2009-01-11 09:26 | Jeff Chen

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

            @陳梓瀚(vczh)
            這個(gè)叫object factory吧,你只能解決已知的類,

            問題在于我的工廠也不知道要構(gòu)造哪些類(根據(jù)配置文件讀)

            Map.Add("A",CreateA());
            添加A的前提是你知道有A這個(gè)類了,你在頭文件里面寫了
            #include <A.h> 而我的需求是在添加的新類后,不能修改原來的所有代碼

            我現(xiàn)在的情況是,工廠只有所有要添加類的基類#include<base.h>
            添加的新類要把他自己的指針注冊(cè)給工廠的map<int, Base*>
            2009-01-11 12:11 | 攀升

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

            C++的反射功能是很弱的,一般而言,都是通過序列化來支持?jǐn)?shù)據(jù)成員的構(gòu)造,如果你還要支持成員函數(shù)(也就是你說的未知類),那就由強(qiáng)類型系統(tǒng)變成了弱類型系統(tǒng)。這個(gè)最好還是結(jié)合一個(gè)成熟的腳本系統(tǒng)來做吧,比如python等。我推薦Qt, 你可以通QtScript來使用JavaScript,配置文件可以通過Json。
            2009-01-11 12:35 | eXile

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

            C++無法解決未知的類,除非你想辦法讓他們變成已知。譬如說插個(gè)DLL什么的。

            關(guān)于你的問題,singleton也是一種辦法。你要知道,除了main函數(shù)以外,也有很多能夠在初始化的時(shí)候執(zhí)行的代碼的。
            2009-01-11 13:09 | 陳梓瀚(vczh)

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

            @eXile
            兄弟,你講的這個(gè)太復(fù)雜了,
            2009-01-11 13:10 | 攀升

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

            @陳梓瀚(vczh)
            我現(xiàn)在的實(shí)現(xiàn)就是把面向構(gòu)件的方法,把每個(gè)擴(kuò)展的類都編譯成.so,通過OpenDLL, 然后調(diào)用構(gòu)造和析構(gòu)函數(shù)
            2009-01-11 13:12 | 攀升

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

            @陳梓瀚(vczh)
            另外像JAVA的反射機(jī)制+XML就很好實(shí)現(xiàn),但是C++不行
            2009-01-11 13:12 | 攀升

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

            @攀升
            "我現(xiàn)在的實(shí)現(xiàn)就是把面向構(gòu)件的方法,把每個(gè)擴(kuò)展的類都編譯成.so,通過OpenDLL, 然后調(diào)用構(gòu)造和析構(gòu)函數(shù)"

            既然如此,為何不用COM呢?

            2009-01-11 14:26 | Jeff Chen

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

            注意,它是.so
            2009-01-11 14:59 | 空明流轉(zhuǎn)

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

            @攀升
            已經(jīng).so的話,我認(rèn)為在C++里面這樣就足夠好了。反射就別想了,反正是沒有的。你只能繞個(gè)彎子做。
            2009-01-11 15:08 | 陳梓瀚(vczh)

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

            我沒看那個(gè)MFC的機(jī)制,
            研究過的博友能不能告訴我,那個(gè)方法能不能實(shí)現(xiàn)未知類的new
            2009-01-11 21:32 | 攀升

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

            @攀升
            當(dāng)然可以。
            此前,我試過將其移植到Symbian系統(tǒng)上。
            2009-01-12 09:23 | Jeff Chen

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

            編程如禪——工廠模式的智能化實(shí)現(xiàn)(c++)(2)消滅switch/case語句以及由名字創(chuàng)建對(duì)象

            http://blog.csdn.net/jicao/archive/2006/07/01/861343.aspx
            2009-01-12 10:21 | cj

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

            #pragma warning (disable:4786)



            #include <iostream>

            #include <map>

            #include <string>



            class Shape;



            typedef Shape *(*FactoryFunction)();



            class ShapeFactory

            {

            public:

            static void Register(std::string name, FactoryFunction instanceFunction)

            {m_FactoryFunctions[name] = instanceFunction;};

            static Shape * getInstance(std::string name)

            { if (m_FactoryFunctions.count(name)) return m_FactoryFunctions[name]();

            else return NULL; }

            private:

            static std::map<std::string,FactoryFunction> m_FactoryFunctions;

            };



            std::map<std::string,FactoryFunction> ShapeFactory::m_FactoryFunctions;



            class Shape

            {

            public:

            virtual void Draw() = 0;

            };



            class Circle : public Shape

            {

            public:

            void Draw() { std::cout << "Drawing a Circle......Done" << std::endl; }

            static Shape *createInstance() {return new Circle;}

            };



            class Triangle : public Shape

            {

            public:

            void Draw() { std::cout << "Drawing a Triagnle......Done" << std::endl; }

            static Shape *createInstance() {return new Triangle;}

            };



            int main()

            {

            ShapeFactory::Register("circle", & Circle::createInstance);

            ShapeFactory::Register("Triangle", & Triangle::createInstance);



            Shape * pShape = NULL;



            pShape = ShapeFactory::getInstance("circle");

            if (NULL == pShape)

            {

            std::cout << "can't find the product in the factory" << std::endl;

            delete pShape;

            }

            else

            {

            pShape->Draw();

            delete pShape;

            }

            return 0;

            }
            2009-01-12 10:24 | cj

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

            用宏應(yīng)該可以的,反正你新加了類,不該原來的代碼,但是總是要重新編譯的哦!

            可以用

            #define CREATEOBJECT (XXX)

            #include <XXX.H>\
            XXX CreateObject() \
            { \
            return new XXX(); \
            } \

            這個(gè)影子可以考慮下!
            2009-01-13 09:53 | 夢(mèng)在天涯

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

            MFC就是啦, 不過是用宏替換的方式
            2009-01-13 22:43 | 多多

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

            從某個(gè)基類派生的類都可以用其類名的字符串創(chuàng)建.
            2009-01-13 22:44 | 多多

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

            我使用的是動(dòng)態(tài)鏈接庫的方法。

            可以實(shí)現(xiàn)這個(gè)功能,不是就是每一個(gè)類都需要編譯成一個(gè)單獨(dú)的文件,

            顯得比較麻煩!
            2009-03-02 15:19 | test

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            91精品国产乱码久久久久久| 国产精品对白刺激久久久| 色婷婷噜噜久久国产精品12p| 久久亚洲精品国产亚洲老地址| 久久久久女人精品毛片| 久久久久久久综合综合狠狠| 久久精品国产亚洲av麻豆蜜芽| 91精品国产综合久久婷婷| 久久久亚洲精品蜜桃臀| 久久99精品久久久久久久久久| 久久综合色区| 天天爽天天爽天天片a久久网| 国产精品中文久久久久久久| 久久久久久a亚洲欧洲aⅴ | 999久久久无码国产精品| 久久久国产一区二区三区| 97久久久久人妻精品专区| 久久成人国产精品免费软件| 狠狠人妻久久久久久综合蜜桃| 亚洲AV日韩精品久久久久久久| 欧美久久久久久午夜精品| 91麻豆精品国产91久久久久久| 久久99精品国产麻豆| 伊人久久久AV老熟妇色| 亚洲国产成人精品91久久久| 久久99国产精品成人欧美| 亚洲国产精品久久| 久久国产精品99久久久久久老狼 | 中文字幕乱码久久午夜| 亚洲欧美国产日韩综合久久| 久久国产高清一区二区三区| 亚洲精品国产成人99久久| 久久综合丝袜日本网| 69久久精品无码一区二区| 久久精品无码专区免费青青| 久久精品亚洲精品国产色婷| 久久大香香蕉国产| 国产国产成人精品久久| 国产69精品久久久久777| 99久久人妻无码精品系列蜜桃| 久久无码人妻一区二区三区 |