Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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+中类声明和实现的位置混乱+;_C++_Class - Fatal编程技术网

C++ c+中类声明和实现的位置混乱+;

C++ c+中类声明和实现的位置混乱+;,c++,class,C++,Class,我还没有找到这个问题的具体答案--我知道.h文件包含类声明,.cpp文件包含实现 我对如何做到不重复感到困惑 如果我有一个类动物,它可能会在程序的几个区域被调用。因此,我似乎不得不多次重新编写实现(这无疑意味着我被误解了) 在给定类的每次使用中都包含一个.h声明和.cpp实现似乎有点愚蠢(证据表明我也误解了一些东西) 我在将申报和执行分开的问题上哪里出错了 我一直在做PHP和Python,所以这可能会让我感到困惑。.cpp文件被编译成对象(.o)文件。 它们从未包含在其他.cpp文件中(这将导致

我还没有找到这个问题的具体答案--我知道.h文件包含类声明,.cpp文件包含实现

我对如何做到不重复感到困惑

如果我有一个类动物,它可能会在程序的几个区域被调用。因此,我似乎不得不多次重新编写实现(这无疑意味着我被误解了)

在给定类的每次使用中都包含一个.h声明和.cpp实现似乎有点愚蠢(证据表明我也误解了一些东西)

我在将申报和执行分开的问题上哪里出错了


我一直在做PHP和Python,所以这可能会让我感到困惑。

.cpp
文件被编译成对象(
.o
)文件。
它们从未包含在其他
.cpp
文件中(这将导致多个定义,这在一般情况下是错误的)

通常由
#include
ing头文件检索的声明是
.cpp
文件可以知道其他
.cpp
文件中定义了什么,并在没有实际定义的情况下使用它的方式

一旦所有
.cpp
文件被编译成目标文件,链接器就会出现并将所有目标文件链接在一起,形成最终的可执行文件或库。

如果找到同一事物的多个定义,或者缺少一个定义,那就是链接器错误。

为什么需要重写实现?您只需
#包含
需要类的标题。您需要清楚地理解#包含的目的。或者使用谷歌盒子…这是C++程序员经常想当然的C++方面的一个棘手的方面。C++中有一种叫做“一定义规则”的东西,概括起来,并有点简化,说明对于每个对象文件(C++标准中的“翻译单元”)只能有一个函数/类的声明,并且在翻译单元之间,如果对于同一个类发生类声明,则必须是相同的。这允许程序员编写一次类声明的代码(在头文件中),并在源文件中重复使用。阅读编译和链接之间的区别。因此,如果我有3个cpp文件,使用Animal.h中的class
Animal
,我只需要在1个cpp文件中编写实现,它会被另外两个人认出来吗?@Pipsqweek是的
Animal.cpp
将包含
Animal
的实现。其他三个
.cpp
文件将通过
Animal.h
了解到
Animal
是一个具有这样或那样的函数、成员等的类。然后,链接器的任务是将它们联系在一起,注意
Foo.o
想要调用
Animal::eat()
,这是在
Animal.o
中定义的。我现在明白了,非常感谢。我脑海中有一个小声音在说:“该死的
import modulename
eyes!”@Pipsqweek,我的荣幸!根据很多人的说法,标题包含系统是C++的弱点之一,但是如果您在使用它之前记录自己,它确实工作得很好。还有一项正在进行的工作是为“真正的”模块标准化系统,我们可能会在C++20中看到:)