Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在头文件中声明类对象_C++_Object_Header_Linker - Fatal编程技术网

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

C++ 在头文件中声明类对象,c++,object,header,linker,C++,Object,Header,Linker,大家好 我似乎正在钻研一个基本问题,但我在任何地方都找不到解决办法。不管是谁,都会继续解释 我有一个由三个文件组成的程序;main.ccp,add.h,add.cpp 我在add.h中声明了类“SA”,并在add.cpp中定义了所有函数 附加.h class SA { ... public int x; } Obj1, Obj2; main.ccp #include "additional.h" int main() { Obj1.x = 5; ...

大家好

我似乎正在钻研一个基本问题,但我在任何地方都找不到解决办法。不管是谁,都会继续解释

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

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

附加.h

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

#include "additional.h" 

int main() {

    Obj1.x = 5;

    ...
}
#include "additional.h" 

int main() {

    SA Obj1;
    Obj1.x = 5;

    ...
}
这使我在编译时出现链接错误: 错误LNK2005:“类SA Obj1”(?Obj1@@3VSA@@A)已在main.obj中定义

对象的唯一定义发生在add.h中,其他地方没有。如果在main中而不是在header中声明对象,则程序可以正常编译:

main.ccp

#include "additional.h" 

int main() {

    Obj1.x = 5;

    ...
}
#include "additional.h" 

int main() {

    SA Obj1;
    Obj1.x = 5;

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

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

像这样:

extern SA Obj1; // in header

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

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

add.h

main.cpp

#include "additional.h" 

SA Obj1, Obj2;

int main() {

 Obj1.x = 5;

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

extern SA Obj1, Obj2;
但您应该在项目中的.cpp文件中声明对象:

main.cpp

#include "additional.h" 

SA Obj1, Obj2;

int main() {

 Obj1.x = 5;

 ...
}
SA Obj1, Obj2;

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

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

static SA Obj1, Obj2;

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

最佳答案。