根据类名动态创建类
目标:
输入一个类名,如果这个类名存在,就创建该类的一个实例,否则,什么也不做。
#include "stdafx.h"#include <afx.h>#include <iostream>#include <string>using namespace std;class A{public: A() { cout<<"A class create !"<<endl; }};class B{public: B() { cout<<"B class create !"<<endl; }};//void* Create(string& classname){ //这里怎么实现?或者有更好解决方法? void* pMyclass; CRuntimeClass* pclass = RUNTIME_CLASS(classname);//这里报错。 pMyclass = pclass->CreateObject(); return pMyclass;}//工厂模式,缺点是如果增加另一个类C,必须修改工厂代码。//目标是当添加一个新类时,不用修改原有代码,所以该方法弃而不用。void* FactoryCreate(string &classname){ void* pMyClass = NULL; if (classname == "A") pMyClass = new A; else if (classname == "B") pMyClass = new B;// else if (classname == "C") 新增加一个类C必须添加这一条件分支// pMyClass = new C; else pMyClass = NULL; return pMyClass;}int _tmain(int argc, _TCHAR* argv[]){ string str; cin>>str; A *pA = (A*)Create(str); delete pA; cin>>str; B *pB = (B*)Create(str); delete pB; system("pause"); return 0;}#include <map>#include <iostream>#include <string>class factory{ struct abs_generator { virtual ~abs_generator(){} virtual void * constructor() = 0; }; template<typename T> struct generator: abs_generator { void * constructor() { return (new T()); } }; struct obj_wrapper { obj_wrapper(abs_generator* ag) : abs_gen_(ag) {} template<typename T> operator T*() { return (dynamic_cast<generator<T>*>(abs_gen_) ? reinterpret_cast<T*>(abs_gen_->constructor()) : 0); } private: abs_generator * abs_gen_; };public: ~factory() { for(std::map<std::string, abs_generator*>::iterator i = genmap_.begin(); i != genmap_.end(); ++i) { delete i->second; } } template<typename T> void material(const std::string& str) { std::map<std::string, abs_generator*>::iterator i = genmap_.find(str); if(i == genmap_.end()) genmap_[str] = new generator<T>; } obj_wrapper make(const std::string& str) { std::map<std::string, abs_generator*>::iterator i = genmap_.find(str); return obj_wrapper(i != genmap_.end() ? i->second : 0); }private: std::map<std::string, abs_generator*> genmap_;};int main(){ factory f; //首先设置可以创建类型 f.material<int>("int"); f.material<std::string>("string"); //创建 int * p = f.make("int"); std::string * str = f.make("string"); cout<<*p<<endl; cout<<*str<<endl;}