c++ - 类(class)自注册程序

标签 c++

我有一些自注册头文件。

Registration<ClassName> objVar ("ClassName "); 

我在 .h 文件本身中添加了这个注册调用。 我指的是 ( http://derydoca.com/2019/03/c-tutorial-auto-registering-factory/ )

现在,当我在一个项目中包含来自不同 .cpp 文件的这个 .h 文件时,它提示说 Registration 已经在一些不同的文件中定义.obj 文件。

您能否帮助我制定正确的处理流程(以下是我找到的一些选项)?

  1. 我想在 .cpp 中包含该注册,但后来我们 必须将那些 .cpp 包含到我需要注册的所有项目中。
  2. 或者我可以使用 /FORCE:MULTIPLE 作为链接器属性的一部分。

最佳答案

在头文件中定义全局变量(在本例中为 objVar)不是一个好主意。如果头文件来自多个编译单元(.cpp 文件),您将获得多个 objVar链接器会提示。

objVar仅用作调用 Registration<ClassName> 的技巧main() 之前的构造函数功能、名称和范围 objVar不重要。您可以在 .cpp 文件中将其声明为静态或在匿名命名空间内。我想您也可以在头文件中将其声明为静态的,但是构造函数将被调用不止一次(因为每个目标文件将有一个 objVar 的拷贝),但似乎可以registerGenerator 的这个实现.

不确定是什么/FORCE:MULTIPLE确实如此,但它也可能会多次运行构造函数。不过,这似乎是一个丑陋的解决方案,而且不可移植。

如果你希望构造函数只被调用一次,你应该把Registration<> .cpp 文件中的定义并与之链接。或者只是以传统方式初始化所有内容,即从 main() .

关于c++ - 类(class)自注册程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59284833/

相关文章:

c# - C++ 和 C# 中的等效系统时钟毫秒数?

c++ - Visual Studio 2019 C++ 对概念的支持 - 编译成功,但出现错误 : Why?

c++ - Mingw Linux编译环境如何安装BerkeleyDB

c++ - 键为 2 的幂的快速映射 (C++)

c# - 使用 DllImport 将非托管 dll 加载到托管应用程序中

c++ - 尝试读取 sizeof() 返回意外结果

c++ - Qt 与 Eclipse CDT Juno

C++ 立即调用析构函数,即使遵循三规则

c++ - 运行系统进程

c++ - 避免虚函数的标准方法