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

依据类名动态创建类

2012-07-04 
根据类名动态创建类目标:输入一个类名,如果这个类名存在,就创建该类的一个实例,否则,什么也不做。C/C++ cod

根据类名动态创建类
目标:
输入一个类名,如果这个类名存在,就创建该类的一个实例,否则,什么也不做。

C/C++ code
#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;}


[解决办法]
来个纯C++的,不要宏的。

C/C++ code
#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;} 

热点排行