所以我可以把所有内容都编译好,而且我理解(我认为)包含防护措施如何阻止相同的定义被拉两次,但我不知道的是我的头文件是否还应该包含头文件对于它使用的类,如果我的类文件已经包含它。
Child.hpp
// Child.hpp
#ifndef CHILD_H
#define CHILD_H
class Child {
public:
Child();
};
#endif
Child.cpp
// Child.cpp
#include "Child.hpp"
Child::Child() {
// example
}
Parent.hpp
我是否还应该在Child.hpp中包含Child.hpp,即使它已包含在Parent.cpp中?我知道头部防守会阻止Child被定义两次,但是它被认为是最佳做法吗?或者我应该在这里专门包含Child.hpp吗?
// Parent.hpp
#ifndef PARENT_H
#define PARENT_H
class Parent {
public:
Parent();
Parent(Child child);
};
#endif
Parent.cpp
// Parent.cpp
#include "Child.hpp"
#include "Parent.hpp"
int main() {
Parent parent;
return 0;
}
Parent::Parent() {
// example
}
Parent::Parent(Child child) {
// example
}
我们刚刚在课堂上给出了一个例子,它基本上说Parent.cpp
它应该包含Parent.hpp
(有意义)和Child.hpp
。
似乎我想在Child.hpp
中加入Parent.hpp
,因为Parent
类依赖于Child
类,但无论哪种方式Child.hpp
都包含在内
答案 0 :(得分:3)
如果Parent
有Child
的个实例,那么您必须将标题包含在Child.hpp
中。
class Parent {
public:
Parent();
Parent(Child child);
Child c; // Needs full include
};
如果Parent
只有指针或引用到Child
,您就可以轻松完成forward-declaring Child
,然后在Parent.cpp
中进行包含。
class Child; // Forward declaration
class Parent {
public:
Parent();
Parent(Child child);
Child* pc; // Just a pointer
};
通常,除非绝对必要,否则应避免在其他标头中包含标头。充其量,它会不必要地增加构建时间。在最坏的情况下,它可能导致循环依赖。