比方說,我有一個字符串裏面我的類名:如何從保存該類名稱的字符串中創建一個類的對象?
mystring = "CDialogChild";
我想創建寫在我的字符串類型名稱的對象。 我想這樣做:
CDialogParent dlg = CDialogParent(mystring);
我的新DLG現在創建類型CDialogChild,我可以使用它的方法:在語言中
dlg.mycdialogchild_method();
比方說,我有一個字符串裏面我的類名:如何從保存該類名稱的字符串中創建一個類的對象?
mystring = "CDialogChild";
我想創建寫在我的字符串類型名稱的對象。 我想這樣做:
CDialogParent dlg = CDialogParent(mystring);
我的新DLG現在創建類型CDialogChild,我可以使用它的方法:在語言中
dlg.mycdialogchild_method();
沒有什麼在C++中,將提供這樣的功能(稱爲反射)。
但是,如果你的類是數量有限的,你可以做某種映射與一些工廠:
class IClassFactory // base interface
{ public:
virtual ~IClassFactory(){}
}
template< class T >
class ClassFactory {
/* whatever necessary here*/
public:
T* create();
};
class ClassManager
{
public:
void add(std::string name, IClassFactory* factory) { m_map[name] = factory; }
ACommonBaseClass* create(std::string class_name) { return m_map[class_name]->create(); } // this line isn't correct but you get the idea
private:
std::map< std::string, IClassFactory* > m_map;
};
或類似的東西(這是快速寫入)。
或者你可以用腳本語言,將允許反思工作,但將一整層添加到您的應用程序。使用C++嵌入可能感興趣的腳本語言:ChaiScript,Falcon,Lua,Python,AngelScript,MonkeyScript,Io,...
一般來說,這是不可能的,因爲C++不是反射式語言,而且它是靜態類型的。
作爲替代方案,你可以考慮硬編碼相關,多態類型的集合與公共基類到程序和編寫創建基於運行時參數所需的具體實例的工廠方法。
有一種設計模式可以完成您的目標:工廠。 您將需要比較的類名和返回對象:
class MyObject;
MyObject * creator(const std::string& object_name)
{
return (object_name == "MyObject") ? new MyObject : 0;
}
工廠模式不同的一點在於它使用指針的基類,並返回子類的實例。
duplicate http://stackoverflow.com/questions/582331/c-is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name –
可能的http重複://stackoverflow.com/questions/1096700/c-instantiate-class-from-name? – blottedscience
「我可以使用它的方法」 - 你永遠不能使用你的變量類型沒有的成員函數。 'CDialogParent'沒有成員函數'mycdialogchild_method'。 –