1

举个例子:

// 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(并且include <string>相应地从 中删除base.h),那么界面无论如何都会中断突出显示。

4

3 回答 3

3

如果界面更改为不包含string,您的派生do_something也必须更改。如果您需要derived.h 独立于接口(例如,由于与接口无关但存在于实现中的细节) - 在这种情况下是的,它是有效的并且可能最好也包含<string>在那里。

于 2013-07-27T06:01:59.787 回答
2

我采取的方法总是为那个文件include添加我需要的任何东西。然后,当我在某处丢失符号时,我不必四处寻找标题和解开依赖网络。包括警卫意味着这很便宜。

但这完全取决于你。如果您想省略它,derived.cpp缩短它,并在以后需要时添加它,那也可以。

根本没有“正确”的答案。

于 2013-07-27T06:00:25.613 回答
0

您可以包含“base.h”。不要想太多。你写的代码越少,你的代码就越好。

#include "base.h"
struct derived :public base
{
    void do_something(const std::string& arg) const
    {
         //...
    }
};
于 2013-07-27T06:00:12.323 回答