是否应将作为基类接口一部分使用的标头包含在派生类中

时间:2013-07-27 05:49:55

标签: c++

采用以下示例:

// 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>移除}然后界面将突破突出显示。

3 个答案:

答案 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
    {
         //...
    }
};