我正在实现一个模式,其中类的实例将由该类的工厂生成。
工厂应该在应用程序启动时注册,理想情况下,注册它们的代码应该在类定义文件中(即不在用户代码中)。
工厂看起来有点像:
template<typename NodeType>
class Factory : public BaseFactory {
public:
shared_ptr<BaseNode> make() override {
return static_pointer_cast<BaseNode>(this->makeTyped());
}
shared_ptr<NodeType> makeTyped() {
return make_shared<NodeType>();
}
};
我还有一个BaseFactory的全局地图(称为FactoryRegister)。
我目前的方法是使用一个执行注册表的“FactoryRegisterDeclataion”类:
template<typename NodeType>
class FactoryRegisterDeclaration {
public:
FactoryRegisterDeclaration() {
FactoryRegister::X().add(make_shared<Factory<NodeType>>()); // X is a singleton of the FactoryRegister
}
};
然后在我喜欢的每个类的c ++文件中:
FactoryRegisterDeclaration<MyNodeClass> MyNodeClassFactory = FactoryRegisterDeclaration<MyNodeClass>();
为此,我的应用程序必须链接该cpp文件。但是,如果应用程序中的任何位置都没有对MyNodeClass的引用,则不会发生这种情况。如果我的应用程序中没有对MyNodeClass的引用,那么cpp文件永远不会包含在内,并且工厂永远不会被注册,从而使我无法创建类实例。
本质上,我试图将以下代码放在类定义cpp文件的顶部,该文件将在应用程序启动时运行:
FactoryRegister::X().add(make_shared<Factory<MyNodeClass>>());
另请注意,MyNodeClass位于由我的应用程序链接的静态库中。我的环境是Visual Studio 2013。
思路:
谢谢和问候