【发布时间】:2019-10-08 18:42:04
【问题描述】:
我有一个类 myClass,它被分成一个 .h 和 .cpp 文件。然后我有一个 main.cpp 文件,我在其中声明了一个 myClass 的全局实例
myClass class1(0,0);
我还有一些使用 class1 的其他 cpp 文件,例如 Funcs.cpp。因此,我创建了一个 extern 文件 extern.h,并将 myClass 实例也声明为 extern:
extern myClass class1;
myClass 有两个可用的构造函数,一个接受两个参数,另外三个(重载)。没有不接受参数的构造函数。有两个参数的构造函数是这样的:
myClass:myClass(int id, int mode);
我的问题是我收到以下错误消息:
标识符 myClass 未定义“extern myClass class1”
...尽管我在 main.cpp、myClass.cpp 和 extern.h 中都包含了 myClass.h。
在多个 cpp 文件之间共享 myClass 的全局实例的正确方法是什么?我通读了Issue declaring extern class object,不同之处在于 myClass 有两个参数,并且我的全局实例是在 main.cpp 而不是 myClass.cpp 中声明的。
【问题讨论】:
-
正确的方法是不要使用全局实例。如果其他一些实例或函数需要
class1(顺便说一句不是最好的名称),则将其传递给他们。顺便说一句,不要考虑“cpp 文件”。你可以将所有代码放在一个文件中,它仍然会做同样的事情(当然有一些例外)。 -
表面问题是你的类的'用户'需要访问全局变量的声明和
myclass的完整声明,即头文件必须同时包含两者。全局变量的实际定义 可以在某处进入单个.cpp文件。 singleton pattern 体现了底层问题(如何安全地定义全局变量)。 -
你能粘贴一个非常精简的文件吗?
-
应该可以。向我们展示您的minimal reproducible example。