采用以下示例:
// base.h
#include <string>
struct base
{
virtual ~base() = default;
virtual void do_something(const std::string& arg) const = 0;
};
// derived.h
struct derived : base
{
void do_something(const std::string& arg) const
{
//...
}
};
在此示例中,derived.h
是否应包含string
标题?
我完全同意包含您使用的内容的原则,但在这种情况下base.h
必须包含string
,如果界面更改为不使用string
(和{{1}相应地从include <string>
移除}然后界面将突破突出显示。
答案 0 :(得分:3)
如果界面更改为不包含string
,则您的派生do_something
也必须更改。如果您需要在接口的derived.h
中单独(例如由于与接口无关但在实现中存在的详细信息) - 在这种情况下是的,它是有效的,可能更适合包含{{ 1}}那里也是。
答案 1 :(得分:2)
我采用始终include
那个文件所需的任何方法。然后,当我在某个地方遗漏符号时,我不必四处搜寻标题并解开依赖关系网。包括警卫意味着这很便宜。
但这完全取决于你。如果你想省略它,为了缩短derived.cpp
,如果有必要,可以在以后添加它,那也没关系。
根本没有“正确”的答案。
答案 2 :(得分:0)
您可以添加“base.h”。不要想太多。你编写的代码越少,你的代码就越好。
#include "base.h"
struct derived :public base
{
void do_something(const std::string& arg) const
{
//...
}
};