如何在文件之间共享全局 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.
上发生碰撞
我有一个 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
.
这意味着您必须在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.
上发生碰撞