首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++可否根据类名直接生成实例对象,该怎么解决

2012-03-28 
c++可否根据类名直接生成实例对象如题所示,比如有个类名是AA,在程序中我们给定字符串“AA”,能否动态生成该

c++可否根据类名直接生成实例对象
如题所示,比如有个类名是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_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函数
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();    }}; 

热点排行