c++ 在头文件中声明类对象

1hdlvixo  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(378)

我似乎碰到了一个基本问题,但我到处都找不到解决办法。不管是谁,请继续解释。
我有一个由三个文件组成的程序;主.ccp、添加. h、添加. cpp。
我在add.h中声明了类“SA”,并在add.cpp中定义了所有函数。
additional.h

class SA {
    ...
public
    int x;
} Obj1, Obj2;

main.ccp

#include "additional.h" 

int main() {

    Obj1.x = 5;

    ...
}

这给我一个链接错误编译:错误LNK 2005:“类别SA对象1”(?对象1@@3VSA@@A)已在main.obj中定义
对象的唯一定义出现在add.h中,而不是其他地方。如果我在main而不是header中声明对象,程序编译得很好:
main.ccp

#include "additional.h" 

int main() {

    SA Obj1;
    Obj1.x = 5;

    ...
}

问题是我想主要在add.cpp中使用对象,但是仍然需要通过main.cpp初始化几个公共值。

ftf50wuq

ftf50wuq1#

在.cpp而不是.h中定义Obj1和Obj2
add.h

class SA {
 ...
public
    int x;
};

main.cpp

#include "additional.h" 

SA Obj1, Obj2;

int main() {

 Obj1.x = 5;

 ...
}

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

extern SA Obj1, Obj2;

但是您应该在项目的.cpp文件中声明这些对象:
main.cpp

SA Obj1, Obj2;

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

rekjcdws

rekjcdws2#

使用 extern 关键字。在头中将这些公共对象声明为extern,然后在其中一个cpp中定义示例。
就像这样:

extern SA Obj1; // in header

SA Obj1;// in any one (no more than one) cpp
62lalag4

62lalag43#

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

static SA Obj1, Obj2;

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

相关问题