c++可否根据类名直接生成实例对象
如题所示,比如有个类名是AA,在程序中我们给定字符串“AA”,能否动态生成该类的一个对象。
[解决办法]
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的实现思路.
[解决办法]
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_; };
[解决办法]
//#define PATTERN_FACTORY#ifdef PATTERN_FACTORYclass 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函数
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(); }};