我知道这可能是愚蠢的,但我无法理解这种情况的用法:
这是源代码的外观:
Class1.h
class Class1
{ //Class 1 definition}
Class2.h
class Class1;
class Class2
{ //Class 2 definition}
那么为什么类Class1 出现在Class2.h中呢?这是一个巨大的源代码,我厌倦了它,因为我无法理解整体流程。任何解释都会给予很大的帮助。谢谢你的帮助!
答案 0 :(得分:5)
这是一份前瞻性声明。
你基本上告诉编译器Class1
是其他地方的一个类。它不一定要知道它的实际结构。
这可用于避免循环引用以及剪切依赖性。
在您给出的示例中,如果您编辑Class1
的内容,则不必仅使用Class2
重新编译翻译单元,即使该类已知。
答案 1 :(得分:1)
class Class1;
class Class2
{ //Class 2 definition}
};
class Class1;
是前向参考。您可以获取地址或引用Class1
的对象。但你不能恭维它。只要实际的Class1
定义不可见,就可以访问任何成员。
答案 2 :(得分:1)
如果Class2只需要指向Class1的指针,那么前向声明就是编译器需要定义Class1 *的所有内容。指向类的指针是编译器类型,只需要在某处存在类型的信息。
你在这里取得的成就是:
答案 3 :(得分:0)
它被称为前瞻性声明。如果Class2使用Class1但尚未定义或实现Class1,则需要此。
答案 4 :(得分:0)
Class2的声明可能需要事先声明Class1,因为在Class2中使用了对Class1对象的指针或引用。也许它们存储为成员数据,或作为函数参数传递。
没有“Class Class1”;但是,C ++编译器不知道Class1是什么。
这个前向声明使编译比包含Class1的整个头文件更快。只要使用指针或Class1的引用,就不需要包含。