首页 > 开发 > C++ > 正文

C++ 如何动态的创建对象

2017-09-11 21:35:20  来源: 网友分享
/** 模板方法 * *  用于创建不同的 Card 实例 */template<typename T>T* Create(int cardNum, char *name, char *password, int cardType){    return new T(cardNum, name, password, cardType);}/** 发卡 * * 传入参数:用户名 *            密码 *            卡的类型 * 返回值:卡号 */int Bank::CreateCard(char *name, char *password, int cardType){    int cardID;    if(cardType == 1)  // 借记卡    {        //cards[CardNum] = new DebitCard(CardNum, name, password, cardType);        cards[CardNum] = Create<CreditCard>(CardNum, name, password, cardType);    }    else if(cardType == 2)  // 贷记卡    {        //cards[CardNum] = new CreditCard(CardNum, name, password, cardType);        cards[CardNum] = Create<DebitCard>(CardNum, name, password, cardType);    }    cardID = 1000 + CardNum;    CardNum++;    return cardID;}

如上面的代码所示,起初我是想创建 Card 的子类对象时去除 if/else 语句的判断,所以定义了一个模板,但是调用模板时候仍然要传入具体的类型,在 CreatCard(...) 方法中,注释部分是之前的代码。如果我想去除 CreateCard(...) 方法中的 if/else 该怎么做呢?如果我用枚举值,C++ 中可以通过枚举字符串值转化为类型吗?

解决方案

C++没有完善的反射机制,这点一直挺为人诟病。但是你这个需求很简单可以实现,思路供参考:

int create_credit_card(...) { ... };int create_debit_card(...) { ... };int Bank::CreateCard(...){    struct { int type; int (*func)(...); } func_map[n] = {        {1, create_credit_card},        {2, create_debit_card},        ...    };    for (i = 0; i < n; i++)    {        if (func_map[i].type == cardType)            ....;    }}