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

How to share a global class instance between files?

我有一个 class, myClass,它分为 .h 和 .cpp 文件。然后我有一个 main.cpp 文件,我在其中声明了一个 myClass 的全局实例

myClass class1(0,0);

我还有一些使用 class1 的其他 cpp 文件,例如 Funcs.cpp。因此,我创建了一个外部文件 extern.h,并将 myClass 实例也声明为外部文件:

extern myClass class1;

myClass 有两个可用的构造函数,一个接受两个参数,另一个接受三个(重载)。没有不接受任何参数的构造函数。带有两个参数的构造函数是这样的:

myClass:myClass(int id, int mode);

我的问题是收到以下错误消息:

Identifier myClass is undefined "extern myClass class1"

...尽管我在 main.cpp、myClass.cpp 和 extern.h 中都包含了 myClass.h。

在多个 cpp 文件之间共享 myClass 全局实例的正确方法是什么?我通读了 Issue declaring extern class object,不同之处在于 myClass 有两个参数,并且我的全局实例是在 main.cpp 中声明的,而不是在 myClass.cpp.

中声明的

问题可能出在包含文件的顺序上。编译器信任地逐行处理每个编译单元,包括 #include.

位置的 .h 文件的内容

这意味着您必须在extern.h之前包含myclass.h:

#include "myclass.h"
#include "extern.h"

虽然使用这样的全局变量是完全合法的,但更像 C 代码,而不是 C++ OOP。那么你应该考虑让它成为你的 class 的静态成员。如果您认为它在您的上下文中意义不大,那么这意味着您的变量可能也不应该是全局的。

如果您将其设为静态成员,它将解决您的问题,因为这样您只需要包含 header 声明您的类型。

一个非常精简的你的需求版本:

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 once 作为守卫而不是 #ifndef UNIQUE_ID、#define UNIQUE_ID、#endif 组合,因为,对于更大的项目,真的很难不在 'UNIQUE_ID's.

上发生碰撞