c++可否根据类名直接生成实例对象,该怎么解决
c++可否根据类名直接生成实例对象
如题所示,比如有个类名是AA,在程序中我们给定字符串“AA”,能否动态生成该类的一个对象。
------解决方案--------------------
如题所示,比如有个类名是AA,在程序中我们给定字符串“AA”,能否动态生成该类的一个对象。
------解决方案--------------------
- C/C++ code
class AA{}; void* GetInstance(char* classname) { if (!strcmp(classname, "AA")) { return new AA; } }
------解决方案--------------------
无论是否使用工厂模式,最终都需要类似于if语句判断来实现。
如果楼主想仅通过类名来得到该类的对象,个人认为C++是不可能实现的。
在java中可以轻易实现(Class c = Class.forName(); Object o = c.newInstance(); )原因是java的解释器支持该操作。
如果你能够将字符串当作一个类,那你的程序不就是一个C++语言解释器么?显然你的程序是不可能实现这种功能。
(个人观点,如果有错误,请不吝赐教)
------解决方案--------------------
宏比if更可气.
1.定义创建函数
A* CreateA();
B* CreateA();
2.建表
map<std::string, Fun>
key: 类名 value: 1.中定义的创建函数指针或仿函数.
3.统一接口
template<class T>
T* CraeteObj(std::string className)
{
Fun fun = map.find(className)->second;
return fun();
}
以上伪代码是Loki::Factory的实现思路.
------解决方案--------------------
- C/C++ code
template < class AbstractProduct, typename IdentifierType, typename ProductCreator = AbstractProduct* (*)(), template<typename, class> class FactoryErrorPolicy = DefaultFactoryError > class Factory : public FactoryErrorPolicy<IdentifierType, AbstractProduct> { public: bool Register(const IdentifierType& id, ProductCreator creator) // id即你的类名字符串,creator即创建函数的指针或仿函数 { return associations_.insert( IdToProductMap::value_type(id, creator)).second; } bool Unregister(const IdentifierType& id) { return associations_.erase(id) == 1; } AbstractProduct* CreateObject(const IdentifierType& id) { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) { return (i->second)(); // 根据id在表里找到创建函数的指针或仿函数,并调用产生对象实例. } return OnUnknownType(id); } private: typedef AssocVector<IdentifierType, ProductCreator> IdToProductMap; IdToProductMap associations_; };
------解决方案--------------------
- C/C++ code
//#define PATTERN_FACTORY #ifdef PATTERN_FACTORY class cProduct { public: virtual ~cProduct() {} }; class cConcreteProduct1 : public cProduct { public: cConcreteProduct1() { cout << "cConcreteProduct1 Construct" << endl;} ~cConcreteProduct1() { cout << "cConcreteProduct1 Deconstruct" << endl; } }; class cConcreteProduct2 : public cProduct { public: cConcreteProduct2() { cout << "cConcreteProduct2" << endl;} ~cConcreteProduct2() { cout << "cConcreteProduct2 Deconstruct" << endl; } }; class cFactory { public: cProduct* CreateProduct1(void) { return new cConcreteProduct1; } cProduct* CreateProduct2(void) { return new cConcreteProduct2; } }; void Use(void) { cFactory *Factory = new cFactory; cProduct *pProduct = Factory->CreateProduct1(); delete pProduct; } #endif
------解决方案--------------------
工厂+原型
用工厂建立一个类群,在基类里弄一个virtual函数
- C/C++ code
class ObjBase { ... virtual ~ObjBase(){} //必须虚析构!! public: virtual ObjBase *Clone() = 0; //是不是纯虚自己定 }; class ObjA { ... public: virtual ObjBase *Clone() { return new ObjA(); } }; class ObjB { ... public: virtual ObjBase *Clone() { return new ObjB(); } };