我有一些自注册头文件。
Registration<ClassName> objVar ("ClassName ");
我在 .h
文件本身中添加了这个注册调用。
我指的是 ( http://derydoca.com/2019/03/c-tutorial-auto-registering-factory/ )
现在,当我在一个项目中包含来自不同 .cpp
文件的这个 .h
文件时,它提示说 Registration 已经在一些不同的文件中定义.obj 文件。
您能否帮助我制定正确的处理流程(以下是我找到的一些选项)?
- 我想在
.cpp
中包含该注册,但后来我们 必须将那些.cpp
包含到我需要注册的所有项目中。 - 或者我可以使用
/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/