我正在实现 unforgettable factory
一切正常,但有一件事:有时没有注册类。

我认为关键部分是 Registrar::registered 成员。如果使用它,“真正有趣的部分”将调用注册该类的 registerT 函数。

在我的玩具示例中,除非任一

  • 构造函数已实现(在 cpp 文件或内联中)。显式默认构造函数和构造函数继承 (*​​) 不注册该类。
  • 在基类 ( Animal ) 中有一个虚方法,它在注册类中被覆盖并在 cpp 文件中实现。内联实现不起作用(与内联 ctor 不同)。

  • 是我弄错了还是作者遗漏了什么?在我的实际应用程序中,有些类已注册,有些未注册,我无法发现差异(所有类都满足 (1.)),这就是我必须加深理解的原因。

    我的问题是: 在什么情况下 registerT 被称为 ?换句话说:Registrar 的构造函数什么时候实例化?
    我应该把 (void) registered; 放在哪里,以便它总是被实例化?

    (*) 为了使构造函数继承工作,我公开了 FactoryFactory<...>::Registrar 的构造函数

    编辑: this question 将我指向 unforgettable factory blog post 。这不是重复的。该问题的作者显然只是忘记添加“真正有趣的部分”和关键的几乎空的构造函数。我没有忘记他们。 我想知道为什么这个关键的几乎空的构造函数虽然存在但没有实例化。

    编辑: 解决方案 是不使用建议的模式。它似乎不适合生产代码,请参阅 the relevant issue

    最佳答案


    这就是导致此和类似自注册计划失败的原因。有一个翻译单元包含实体的定义,这些实体的定义在程序的其他地方没有被引用,而只能由在同一翻译单元中定义的静态变量的初始值设定项引用。实现可能会选择推迟该静态变量的初始化,直到其翻译单元中的任何内容都被 odr 使用 - 这永远不会。

    关于c++ - 难忘的工厂 : When is constructor instantiated?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59919831/

    10-13 04:06