classFactory自动添加到ClasStypeFactory中

ClassFactory automatic added to ClassTypeFactory

本文关键字:ClasStypeFactory 添加 classFactory      更新时间:2023-10-16

我有三个类。一个看起来像这样的ClassFactoryBase

class ClassFactoryBase {
public:
    virtual ~ClassFactoryBase () = default;
    virtual AbstractBase* Create() = 0;
};

我从该类继承了实际工厂作为模板

template <typename Type>
class ClassFactory final : public ClassFactoryBase {
    ClassFactory (/*ClassFactoryBase& Factory*/); //Idea to automatically add them
    ~ClassFactory () = default;
    AbstractBase* Create() override; //returns new Type
};

和OFC我实施了工厂本身:

class ClassTypeFactory {
public:
    template<typename Type>
    void AddFactory(ClassFactoryBase& ClassFactory); // inserts ClassFactory into the map m_Factories
    AbstractBase* Create(const std::string& ClassType);
private:
    std::map<std::string, ClassFactoryBase&> m_Factories;
};

如果我这样实现了,我必须在main.cpp

的内部添加到它。
ClassTypeFactory class_type_factory;
ClassFactory<TopClass> top_state_factory(&class_type_factory);
class_type_factory.AddFactory<TopClass>(top_class_factory); // leave this out

这很好,但是我想知道我是否可以以一种可以忽略最后一行的方式实现它。我认为它应该起作用,因为它们都使用相同的模板参数。我试图给我的classFactory对工厂的引用,而不是在其中调用AddFactory方法,但我无法使其起作用。我总是会遇到无法访问的错误。

您只需要按正确的顺序进行操作即可。遵循示例的修改版本(使用智能指针(:

// Your objects to create:
struct AbstractBase
{
    virtual ~AbstractBase () = default;
    // ...
};
struct Derived : AbstractBase
{
    // ...
};
// Your abstract factory
class ClassFactoryBase {
public:
    virtual ~ClassFactoryBase () = default;
    virtual std::unique_ptr<AbstractBase> Create() = 0;
};
// Your factory collection    
class ClassTypeFactory {
public:
    void AddFactory(const std::string& name, ClassFactoryBase& factory) { m_Factories.emplace(name, std::ref(factory)); }
    std::unique_ptr<AbstractBase> Create(const std::string& name)
    {
        return m_Factories.at(name).get().Create();
    }
private:
    std::map<std::string, std::reference_wrapper<ClassFactoryBase>> m_Factories;
};
// Your real factory
template <typename Type>
class ClassFactory final : public ClassFactoryBase {
public:
    ClassFactory(const std::string& name, ClassTypeFactory& factory) { factory.AddFactory(name, *this); }
    std::unique_ptr<AbstractBase> Create() override { return std::make_unique<Type>(); }
};

然后用法:

ClassTypeFactory class_type_factory;
ClassFactory<Derived> top_state_factory("TopClass", class_type_factory);
auto ptr = class_type_factory.Create("TopClass");

demo

相关文章:
  • 没有找到相关文章