在头文件中声明类对象

Rau*_*nar 6 c++ linker header object

大家问候.

我似乎在寻找一个基金但我无法在任何地方找到解决方案.Anywho,将继续解释.

我有一个由三个文件组成的程序; main.ccp,add.h,add.cpp.

我在add.h中声明了类'SA',并在add.cpp中定义了所有函数

additional.h

class SA {
    ...
public
    int x;
} Obj1, Obj2;
Run Code Online (Sandbox Code Playgroud)

main.ccp

#include "additional.h" 

int main() {

    Obj1.x = 5;

    ...
}
Run Code Online (Sandbox Code Playgroud)

这给我一个关于编译的链接错误:错误LNK2005:已经在main.obj中定义的"class SA Obj1"(?Obj1 @@ 3VSA @@ A)

对象的唯一定义发生在add.h中,而没有其他地方.如果声明main中的对象而不是标题,程序编译得很好:

main.ccp

#include "additional.h" 

int main() {

    SA Obj1;
    Obj1.x = 5;

    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是我想在add.cpp中初步使用这些对象,但仍需要通过main.cpp初始化几个公共值.任何智慧的话?

MrV*_*dez 12

在你的.cpp而不是.h中声明Obj1和Obj2

add.h

class SA {
 ...
public
    int x;
};
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "additional.h" 

SA Obj1, Obj2;

int main() {

 Obj1.x = 5;

 ...
}
Run Code Online (Sandbox Code Playgroud)

如果要在.h文件中声明Obj1和Obj2,请在.h文件中添加extern,如下所示:

extern SA Obj1, Obj2;
Run Code Online (Sandbox Code Playgroud)

但是你应该在项目的.cpp文件中声明对象:

main.cpp中

SA Obj1, Obj2;
Run Code Online (Sandbox Code Playgroud)

原因是每次包含.h文件时,都会声明Obj1和Obj2.因此,如果您将.h文件包含两次,则将创建两个Obj1和Obj2实例.通过添加关键字extern,您告诉编译器您已经在项目的某处(最好是在.cpp文件中)对两个变量进行了decalred.


sha*_*oth 6

使用extern关键字.在标头中将这些公共对象声明为extern,然后在其中一个cpp中定义实例.

像这样:

extern SA Obj1; // in header

SA Obj1;// in any one (no more than one) cpp
Run Code Online (Sandbox Code Playgroud)


小智 5

您还可以在头文件中包含以下代码行:

static SA Obj1, Obj2;
Run Code Online (Sandbox Code Playgroud)

这将在运行时仅创建每个对象的 1 个实例并防止重新定义。但是,请记住,包含 .h 文件的所有文件都将使用这两个对象的相同实例,因此在访问它们时需要小心。