应用程序从任意c ++文件开始执行代码

时间:2014-10-31 07:16:38

标签: c++ static global extern

我正在实现一个模式,其中类的实例将由该类的工厂生成。

工厂应该在应用程序启动时注册,理想情况下,注册它们的代码应该在类定义文件中(即不在用户代码中)。

工厂看起来有点像:

    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。

思路:

  1. 是否可以强制VS将CPP文件链接到静态库(可能是错过了)?或者包含静态库的应用程序意外地剥离了“未使用的”符号?
  2. 是否有其他模式可以让我在应用程序启动时创建和注册工厂?
  3. 谢谢和问候

0 个答案:

没有答案