提問: 可以根據字符串創建類嗎
語言當然是c++了,大家可能都碰到了,在使用工廠的時候其實還是要在某個地方寫死new A()這樣的代碼,我現在想根據配置文件或者其它的途徑創建類(類似于JAVA的反射機制);
目標就是,新加入一個類時,我不要改動原來工廠的代碼,程序知道新加的類的名字的字符串(通過讀配置文件)。
各位C++大牛們想像辦法,實在不可能的話,推薦下國外有沒有這種實現的開源項目
謝謝了!
|
提問: 可以根據字符串創建類嗎語言當然是c++了,大家可能都碰到了,在使用工廠的時候其實還是要在某個地方寫死new A()這樣的代碼,我現在想根據配置文件或者其它的途徑創建類(類似于JAVA的反射機制); 目標就是,新加入一個類時,我不要改動原來工廠的代碼,程序知道新加的類的名字的字符串(通過讀配置文件)。 各位C++大牛們想像辦法,實在不可能的話,推薦下國外有沒有這種實現的開源項目 謝謝了! 評論# re: 提問: 可以根據字符串創建類嗎 回復 更多評論C++編譯器的RTTI能力很弱。不過如果夠猛可以寫一個Front專門給各種類加RTTI就好了。
2009-01-10 17:32 | 空明流轉
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論ACDK這個庫可以,不過比較大,使用C++語言按照java語言規范來實現的基礎庫。不過如果走到這一步,大可不比使用C++了。
2009-01-10 20:59 | 萬連文
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論Nebula3里的類就有這個特性http://blog.csdn.net/xoyojank/archive/2008/07/03/2608400.aspx 具體見SDK源碼
2009-01-10 23:21 | xoyojank
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論最簡單的辦法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"); ------------------------------- 如果你熟悉模板的話,可以實現的更漂亮一點。
2009-01-11 00:55 | 陳梓瀚(vczh)
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論@陳梓瀚(vczh)這個叫object factory吧,你只能解決已知的類, 問題在于我的工廠也不知道要構造哪些類(根據配置文件讀) Map.Add("A",CreateA()); 添加A的前提是你知道有A這個類了,你在頭文件里面寫了 #include <A.h> 而我的需求是在添加的新類后,不能修改原來的所有代碼 我現在的情況是,工廠只有所有要添加類的基類#include<base.h> 添加的新類要把他自己的指針注冊給工廠的map<int, Base*>
2009-01-11 12:11 | 攀升
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論C++的反射功能是很弱的,一般而言,都是通過序列化來支持數據成員的構造,如果你還要支持成員函數(也就是你說的未知類),那就由強類型系統變成了弱類型系統。這個最好還是結合一個成熟的腳本系統來做吧,比如python等。我推薦Qt, 你可以通QtScript來使用JavaScript,配置文件可以通過Json。
2009-01-11 12:35 | eXile
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論C++無法解決未知的類,除非你想辦法讓他們變成已知。譬如說插個DLL什么的。關于你的問題,singleton也是一種辦法。你要知道,除了main函數以外,也有很多能夠在初始化的時候執行的代碼的。
2009-01-11 13:09 | 陳梓瀚(vczh)
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論@陳梓瀚(vczh)我現在的實現就是把面向構件的方法,把每個擴展的類都編譯成.so,通過OpenDLL, 然后調用構造和析構函數
2009-01-11 13:12 | 攀升
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論@攀升"我現在的實現就是把面向構件的方法,把每個擴展的類都編譯成.so,通過OpenDLL, 然后調用構造和析構函數" 既然如此,為何不用COM呢?
2009-01-11 14:26 | Jeff Chen
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論@攀升已經.so的話,我認為在C++里面這樣就足夠好了。反射就別想了,反正是沒有的。你只能繞個彎子做。
2009-01-11 15:08 | 陳梓瀚(vczh)
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論編程如禪——工廠模式的智能化實現(c++)(2)消滅switch/case語句以及由名字創建對象http://blog.csdn.net/jicao/archive/2006/07/01/861343.aspx
2009-01-12 10:21 | cj
# re: 提問: 可以根據字符串創建類嗎 回復 更多評論#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
|
||||||||||||||||||||||