我有一些自注册的头文件。
Registration<ClassName> objVar ("ClassName ");
我正在.h
文件本身中添加此注册调用。 我指的是(http://derydoca.com/2019/03/c-tutorial-auto-registering-factory/(
现在,当我在项目中包括来自不同.cpp
文件的这个.h
文件时,它抱怨已经在某个不同的.obj文件中定义了注册。
你能帮我处理这个问题的正确过程吗(以下是我找到的一些选项(?
- 我想在
.cpp
中包括该注册,但后来我们 必须包括我需要注册的所有项目的.cpp
。 - 或者我可以将
/FORCE:MULTIPLE
用作链接器属性的一部分。
在头文件中定义全局变量(在这种情况下objVar
(是一个坏主意。如果头文件来自多个编译单元(.cpp 个文件(,你将收到多个objVar
,链接器将投诉。
由于objVar
仅用作在main()
函数之前调用Registration<ClassName>
构造函数的技巧,因此objVar
的名称和范围并不重要。可以将其声明为静态或.cpp文件中的匿名命名空间。我想您也可以在头文件中将其声明为静态,但是随后构造函数将被多次调用(因为每个对象文件将有一个objVar
副本(,但似乎可以与这个实现registerGenerator
。不完全确定/FORCE:MULTIPLE
做什么,但它也可能多次运行构造函数。不过,这似乎是一个丑陋的解决方案,而且不便携。
如果希望构造函数只调用一次,则应将Registration<>
定义放在.cpp文件中并与之链接。或者只是以传统方式初始化所有内容,即从main()
.