包含在头文件中

Include in header files

本文关键字:文件 包含      更新时间:2023-10-16
class A{
private:
     std::string id;
public:
     void f();
};

给出编译时错误。但是,如果我include <string>顶部,它可以正确编译。不过,我不想在标题中使用包含语句。我该怎么做?

在其他标头中包含标头是完全必要的。尽可能减少它是明智的,但从根本上说,如果你的类依赖于std::string,那么你别无选择,只能在标题中#include <string>。此外,依赖任何和/或所有标准类绝对没有错 - 毕竟,它们在任何实现中都必须提供。using namespace std;不高兴。

在这种情况下

,您必须包含<string>才能使用std::string

唯一可以避免 #including 标头的时刻是仅在标头中使用对象的引用或指针。在这种情况下,您可以使用前向声明。但是由于 std::string 是一个 typedef,你不能转发声明它,你必须包含它。

我相信您正在尝试遵循建议以尽可能少地#include,但在这种情况下您不能遵循它。

std::string 在 std 命名空间的 <string> 头文件中定义。你必须包括它。

在包含其他头文件之前,您可以通过在实现文件中包含必要的文件来确保满足所有依赖项,即在包含您自己的头文件之前#include <string>确保它出现在实现文件(.cpp(的第一行。

这并不完全是最佳做法。所有头文件都应满足自己的依赖项,因此头文件的用户无需关心依赖项。至少这是我的拙见。

您可能

听说过在标头中使用using namespace std;是不明智的,这是真的,因为包含该标头的任何内容都卡在全局命名空间中的所有内容中。 包括您需要的头文件是完全可以接受的。

不幸的是,

您无法绕过它。

即使您的类定义如下所示:

class A {
private:
     std::string* id;
public:
     void f();
};

那么你仍然无能为力,因为向前宣布std::basic_string<char, etc>是一种痛苦。我什至不打算演示。

幸运的是,尽管标头中的using namespace std绝对是禁忌,但您通常可以在自己的标头中#include标准标头,而不必担心。

可能一些疯狂的extern声明会有所帮助,但这不是一种方法。为什么不想包含在头文件中?