班级自助注册程序

  • 本文关键字:注册 程序 c++
  • 更新时间 :
  • 英文 :


我有一些自注册的头文件。

Registration<ClassName> objVar ("ClassName "); 

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

现在,当我在项目中包括来自不同.cpp文件的这个.h文件时,它抱怨已经在某个不同的.obj文件中定义了注册。

你能帮我处理这个问题的正确过程吗(以下是我找到的一些选项(?

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

在头文件中定义全局变量(在这种情况下objVar(是一个坏主意。如果头文件来自多个编译单元(.cpp 个文件(,你将收到多个objVar,链接器将投诉。

由于objVar仅用作在main()函数之前调用Registration<ClassName>构造函数的技巧,因此objVar的名称和范围并不重要。可以将其声明为静态或.cpp文件中的匿名命名空间。我想您也可以在头文件中将其声明为静态,但是随后构造函数将被多次调用(因为每个对象文件将有一个objVar副本(,但似乎可以与这个实现registerGenerator

。不完全确定/FORCE:MULTIPLE做什么,但它也可能多次运行构造函数。不过,这似乎是一个丑陋的解决方案,而且不便携。

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

最新更新