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

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_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();
    }
};