11

大家好。

我似乎陷入了困境,但我无法在任何地方找到解决方案。任何人,都会继续解释。

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

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

附加.h

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

主文件

#include "additional.h" 

int main() {

    Obj1.x = 5;

    ...
}

这给了我编译时的链接错误:error LNK2005: "class SA Obj1" (?Obj1@@3VSA@@A) already defined in main.obj

对象的唯一定义出现在 add.h 中,没有其他地方。如果在 main 而不是 header 中声明对象,则程序编译得很好:

主文件

#include "additional.h" 

int main() {

    SA Obj1;
    Obj1.x = 5;

    ...
}

问题是我想主要在 add.cpp 中使用对象,但仍然需要通过 main.cpp 初始化几个公共值。有什么智慧之言吗?

4

3 回答 3

20

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

添加.h

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

主文件

#include "additional.h" 

SA Obj1, Obj2;

int main() {

 Obj1.x = 5;

 ...
}

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

extern SA Obj1, Obj2;

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

主文件

SA Obj1, Obj2;

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

于 2009-03-11T07:29:46.963 回答
7

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

像这样:

extern SA Obj1; // in header

SA Obj1;// in any one (no more than one) cpp
于 2009-03-11T07:28:09.323 回答
6

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

static SA Obj1, Obj2;

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

于 2010-02-25T16:47:11.157 回答