C++实现根据字符串创建对象

#ifndef TEMPLATE_H_H
#define TEMPLATE_H_H

#include <iostream>
#include <functional>
#include <string>
#include <map>

class Base {
public:
    virtual void testFunction() {
        std::cout << "Base::testFunction" << std::endl;
    }
};

class Child : public Base {
public:
    virtual void testFunction() override {
        std::cout << "Child::testFunction" << std::endl;
    }
};

using CreateClassObjectFunc = std::function<Base*()>;

class ClassFactory
{
public:
    ~ClassFactory() {
        classMap_.clear();
    }

public:
    bool registerClass(const std::string& name, CreateClassObjectFunc func)
    {
        if (classMap_.find(name) == classMap_.end()) {
            classMap_.emplace(name, func);
        }
        else {
            classMap_[name] = func;
        }

        return true;
    }

    Base* createObject(const std::string& name)
    {
        auto iter = classMap_.find(name);
        if ( iter == classMap_.end()) {
            return nullptr;
        }

        return iter->second();
    }

    static ClassFactory* Instance() {
        static ClassFactory obj;
        return &obj;
    }

protected:
    ClassFactory() = default;

private:
    std::map<std::string, CreateClassObjectFunc> classMap_;
};

#define REGISTER_CLASS(ClassName) \
    extern bool ret##ClassName;


/**
 * .cpp
 * #undef REGISTER_CLASS
 * #define REGISTER_CLASS(ClassName) \
 *   bool ret##ClassName = ClassFactory::Instance()->registerClass(#ClassName, []()->CMessageMsg* { \
 *       return new ClassName; \
 *   });
 *
 * REGISTER_CLASS(Base)
 * REGISTER_CLASS(Child)
 */
#endif

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值