头文件是否应包含其他头文件,还是将其留给实现?

时间:2015-02-15 17:17:24

标签: c++

所以我可以把所有内容都编译好,而且我理解(我认为)包含防护措施如何阻止相同的定义被拉两次,但我不知道的是我的头文件是否还应该包含头文件对于它使用的类,如果我的类文件已经包含它。

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都包含在内

1 个答案:

答案 0 :(得分:3)

如果ParentChild个实例,那么您必须将标题包含在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
};

通常,除非绝对必要,否则应避免在其他标头中包含标头。充其量,它会不必要地增加构建时间。在最坏的情况下,它可能导致循环依赖。