What does a semicolon after a class name do?
我在读的书中注意到这样的代码行:
1 2 3 4 5 6 7 8 9 10 11 12
| namespace sf
{
class RenderWindow;
}
class StateStack;
class Player;
class State
{
// Code for the class
}; |
仅包含类、类名和分号的行是什么意思?
- 也许这会有所帮助:stackoverflow.com/questions/1410563/…
这是前向声明。他们让我们知道下面的代码有一个RenderWindow类名称,StateStack和Player。本论文的第一个编译器,当它用于湖的名字。在左后想找到类的定义。
- 好吧,那么使用这个有什么好处呢?似乎只将文件包含在该类中更容易?
- @Connor的优势出现在A类使用B类和B类使用A类的情况下。这需要一个前向声明,因为如果您在B.h中使用#include"A.h",反之亦然,您将得到一个无限循环以及同一类的重复定义。
- 哦,好吧,这很有道理,谢谢你的帮助!
- @康纳,它只是让编译器知道它的存在,而没有真正存在的完整类。
- "以后的链接器"-->"以后的编译器"。
- @MattmcNabb我支持我的原始答案。forward声明告诉编译器类存在。链接器找出类的代码在哪里。
- 是编译器找到类的定义。链接不将类定义与类前向声明匹配(但它将函数定义与函数声明匹配,将非成员变量定义与非成员变量声明匹配)。类定义必须是可见的,编译器才能编译依赖于类定义的任何代码。
- @mattmcnab如果在使用时需要完整的定义,编译器会抱怨。casper von b指出,只有在不需要完整定义的情况下才需要前向引用,例如指针或引用。
这是一个前馈信号不明确,它的定义是,在后续的编译全想的地方。
这是主用例的用例,你不需要完整的定义,例如,如果你有一个指针的类型T你不需要完整的定义和其T直到instantiation因此不需要有一个T*宣言。
- 这是必要的,因为编译器的简单性质,没有查找,如果它没有在翻译单元中声明,它就不存在。