向大家致意。
我似乎在寻找一个基金但我无法在任何地方找到解决方案。 Anywho,将继续解释。
我有一个由三个文件组成的程序; main.ccp,add.h,add.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;
...
}
这给我一个关于编译的链接错误: 错误LNK2005:已在main.obj中定义的“class SA Obj1”(?Obj1 @@ 3VSA @@ A)
对象的唯一定义发生在add.h中,而没有其他地方。如果声明主要而不是标题中的对象,程序编译得很好:
main.ccp
#include "additional.h"
int main() {
SA Obj1;
Obj1.x = 5;
...
}
问题是我想在add.cpp中初步使用这些对象,但仍需要通过main.cpp初始化几个公共值。任何智慧的话语?
答案 0 :(得分:12)
在.cpp而不是.h
中声明Obj1和Obj2add.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文件中)对两个变量进行了十分转换。
答案 1 :(得分:6)
使用 extern 关键字。在头文件中将这些公共对象声明为extern,然后在其中一个cpps中定义实例。
像这样:
extern SA Obj1; // in header
SA Obj1;// in any one (no more than one) cpp
答案 2 :(得分:4)
您还可以在头文件中包含以下代码行:
static SA Obj1, Obj2;
这将在运行时仅创建每个对象的1个实例,并防止重新定义。但是,请记住,包含.h文件的所有文件都将使用这两个对象的相同实例,因此在访问它们时需要小心。