我似乎碰到了一个基本问题,但我到处都找不到解决办法。不管是谁,请继续解释。
我有一个由三个文件组成的程序;主.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初始化几个公共值。
3条答案
按热度按时间ftf50wuq1#
在.cpp而不是.h中定义Obj1和Obj2
add.h
main.cpp
如果要在.h文件中声明Obj1和Obj2,请在.h文件中添加extern,如下所示:
但是您应该在项目的.cpp文件中声明这些对象:
main.cpp
这样做的原因是,每次包含.h文件时,都是在声明Obj1和Obj2。因此,如果包含两次.h文件,则将创建Obj1和Obj2的两个示例。通过添加关键字extern,您将告诉编译器您已经在项目中的某个位置声明了这两个变量(最好是在.cpp文件中)。
rekjcdws2#
使用 extern 关键字。在头中将这些公共对象声明为extern,然后在其中一个cpp中定义示例。
就像这样:
62lalag43#
您还可以在头文件中包含以下代码行:
这将在运行时为每个对象只创建一个示例,并防止重新定义。但是,请记住,包括.h文件的所有文件都将使用这两个对象的同一个示例,因此在访问它们时需要小心。