我有一个类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中声明的。
答案 0 :(得分:3)
问题可能是包含文件的顺序。编译器逐行信任地处理每个编译单元,包括位于#include
位置的.h文件的内容。
这意味着您必须在extern.h之前包含myclass.h:
#include "myclass.h"
#include "extern.h"
答案 1 :(得分:3)
您的要求的精简版本可以正常工作:
myclass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
class myClass
{
public:
myClass(int, int);
};
#endif // MYCLASS_H
extern.h:
#ifndef EXTERN_H
#define EXTERN_H
#include "myclass.h"
extern myClass class1;
#endif // EXTERN_H
usingextern.cpp:
#include "extern.h"
bool variable_named_class1_exists()
{
return (bool)&class1;
}
在更现代的C ++版本中/使用现代编译器,我更喜欢一次使用#pragma作为防护,而不是#ifndef UNIQUE_ID,#define UNIQUE_ID,#endif组合,因为对于一个较大的项目,要结束它确实很难并在“ UNIQUE_ID”上发生冲突。
答案 2 :(得分:0)
尽管使用这样的全局变量完全合法,但更像是C语言代码,而不是C ++ OOP。然后,您应该考虑使其成为类的静态成员。如果您认为它在上下文中的意义不大,则意味着您的变量也可能也不应该是全局变量。
如果将其设置为静态成员,它将解决您的问题,因为您只需要包含声明您的类型的标头即可。