一个类名后面的分号有什么作用?

3

我在阅读的书中发现了像这样的代码:

namespace sf
{
class RenderWindow;
}

class StateStack;
class Player;

class State
{
    // Code for the class
};

这些只含有类名和分号的行是什么意思?

3
或许这可以帮助您:https://dev59.com/V3M_5IYBdhLWcg3wXx1N?lq=1 - chris
2个回答

13

这些是前置声明。它们让下面的代码知道有名为RenderWindowStateStackPlayer的类存在。当编译器看到这些名称被使用时,便满足了编译器。稍后,链接器会找到类的定义。


2
@Connor 当类A使用类B并且类B使用类A时,优势出现在这种情况下。这需要前向声明,因为如果你在B.h中包含了#include "A.h",反之亦然,你将得到一个无限循环以及相同类的重复定义问题。 - Code-Apprentice
哦,好的,那很有道理,谢谢你的帮助! - Connor
1
"Later the linker" --> "稍后编译器" - M.M
1
@MattMcNabb 我坚持我的原始答案。前向声明告诉编译器该类存在,而链接器则找出该类代码的位置。 - Code-Apprentice
如果在使用时需要完整的定义,编译器会发出警告。Casper Von B提出了一个很好的观点,即当不需要完整的定义(例如指针或引用)时才需要前向引用。 - Code-Apprentice
显示剩余3条评论

4

它是一种前置声明,实质上向编译器发出一个信号,全定义将在其他地方跟随。

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


这是必要的,因为编译器的简单性质,它没有查找功能,如果在翻译单元中没有声明,它就不存在。 - Casper Beyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接