gpt4 book ai didi

c++ - ClassFactory 自动添加到 ClassTypeFactory

转载 作者:行者123 更新时间:2023-11-30 04:47:27 28 4
gpt4 key购买 nike

我上了三门课。一个看起来像这样的 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

};

我自己实现了工厂:

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

关于c++ - ClassFactory 自动添加到 ClassTypeFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56233855/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com