我必须重构一个旧代码.它的一个问题是它超过了无用的“包括”.在同一个项目中,我看到了以下语法:
#include <AnyClass> //A system header #include "AnotherAnyClass" //A application header class AnotherClass; class Class : public OneMoreClass { public: explicit Class(); ~Class(); private: AnotherClass *m_anotherClass; }
我想弄明白:
>“包含”类“和”类类“之间有什么区别?
>何时应该使用第二种方法以及如何使用?
解决方法
这是两件不同的事情:
#include <AnyClass>
这是标题(或任何类型的文本)文件的常规包含.它等同于在您键入包含指令的位置粘贴AnyClass文件的内容(这就是为什么包含保护和/或编译器编译指示通常用于防止同一文件中的多个包含).
这个语法:
class AnotherClass;
是一个forward declaration,它告诉编译器存在AnotherClass类.它在许多场景中都很有用,例如假设你有两个类,每个类需要一个指向另一个的指针:
class ClassB { ClassA* pointer_to_classA; }; class ClassA { ClassB* pointer_to_classB; };
上面的代码将生成一个错误:“错误:未知类型名称’ClassA’”因为您使用了ClassA类型而编译器不知道它是什么(还).编译器的解析器在解析类声明的开头时只能了解ClassA的存在.
要完成上述工作,您需要一个前瞻性声明:
class ClassA; // A ClassA type exists class ClassB { ClassA* pointer_to_classA; }; class ClassA { ClassB* pointer_to_classB; };