如何在文件之间共享全局类实例?

时间:2019-05-22 09:52:39

标签: c++ class extern c++98

我有一个类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中声明的。

3 个答案:

答案 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。然后,您应该考虑使其成为类的静态成员。如果您认为它在上下文中的意义不大,则意味着您的变量也可能也不应该是全局变量。

如果将其设置为静态成员,它将解决您的问题,因为您只需要包含声明您的类型的标头即可。