Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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++ - Fatal编程技术网

C++ 类名后面的分号是做什么的?

C++ 类名后面的分号是做什么的?,c++,C++,在我正在阅读的书中,我注意到这样的代码行: namespace sf { class RenderWindow; } class StateStack; class Player; class State { // Code for the class }; 只有类、类名和分号的行是什么意思?这些是正向声明。它们让下面的代码知道有名称为RenderWindow、StateStack和Player的类。当编译器看到使用了这些名称时,它会感到满意。稍后,链接器将找到类的定义。它是一个转

在我正在阅读的书中,我注意到这样的代码行:

namespace sf
{
class RenderWindow;
}

class StateStack;
class Player;

class State
{
    // Code for the class
};

只有类、类名和分号的行是什么意思?

这些是正向声明。它们让下面的代码知道有名称为
RenderWindow
StateStack
Player
的类。当编译器看到使用了这些名称时,它会感到满意。稍后,链接器将找到类的定义。

它是一个转发声明,本质上它向编译器发出信号,表示完整的定义将跟随在其他地方


这方面的主要用例是不需要完整定义的情况,例如,如果您有一个
T
类型的指针,则在实例化之前不需要
T
的完整定义,因此不需要声明
T*

,这可能会有所帮助:Ok,那么使用这个有什么好处呢?似乎只将文件包含在该类中更容易?@Connor在类A使用类B而类B使用类A的情况下,优势就出现了。这需要一个转发声明,因为如果在
中包含“A.h”
,反之亦然,对于同一个类,您会得到一个无限循环以及重复的定义。哦,好的,这很有意义,谢谢您的帮助@Connor它只是让编译器知道它存在,而实际上没有完整的类。“稍后链接器”->“稍后编译器”。这是必要的,因为编译器过于简单,没有查找,如果它没有在翻译单元中声明,它就不存在。