gpt4 book ai didi

c++ - 头文件应该包含其他头文件,还是留给实现?

转载 作者:行者123 更新时间:2023-12-01 14:44:58 25 4
gpt4 key购买 nike

所以我可以编译所有内容,并且我理解(我认为)包含保护如何防止相同的定义被拉取两次,但我不知道我的头文件是否也应该包含头文件它使用的类,如果我的类文件已经包含它的话。

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 已经包含在 Parent.cpp 中,我是否还应该在此处包含它?我知道 header guard 会阻止 Child 被定义两次,但这是否被认为是最佳实践?或者我应该在这里专门包含 Child.hpp 吗?

// Parent.hpp
#ifndef PARENT_H
#define PARENT_H

class Parent {
public:
Parent();
Parent(Child child);
};

#endif

父类.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

我似乎想在 Parent.hpp 中包含 Child.hpp,因为 Parent 类依赖于 Child 类,但无论哪种方式 Child.hpp 都包含在内。

最佳答案

如果 ParentChild 的任何实例,是的,您必须将 header 包含到 Child.hpp 中。

class Parent {
public:
Parent();
Parent(Child child); // Need full include, complete type used
Child c; // Need full include, complete type used
};

如果 Parent 只有 pointersreferencesChild 你可以简单地逃脱 forward-declaring Child,然后在 Parent.cpp 中进行包含。

class Child;                     // Forward declaration
class Parent {
public:
Parent();
Parent(Child* child);
Child* pc; // Incomplete type ok if pointer or reference
};

一般来说,除非绝对必要,否则您应该避免在其他 header 中包含 header 。充其量,它会不必要地增加构建时间。在最坏的情况下,它会导致循环依赖。

关于c++ - 头文件应该包含其他头文件,还是留给实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28528784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com