class A{
private:
std::string id;
public:
void f();
};
给出编译时错误。但是,如果我include <string>
位于顶部,则会正确编译。但是,我不想在标题中使用include语句。我该怎么办?
答案 0 :(得分:12)
在其他标题中包含标题是完全必要的。尽可能减少它是明智的,但从根本上说,如果你的课程依赖于std::string
,那么除了标题中的#include <string>
之外你别无选择。此外,根据任何和/或所有标准类,绝对没有任何问题 - 毕竟,它们被强制要求在任何实现上提供。这是using namespace std;
不赞成的。
答案 1 :(得分:11)
在这种情况下,您必须包含<string>
才能使用std::string
。
当你只使用标题中对象的引用或指针时,唯一可以避免#including标题的时刻。在这种情况下,您可以使用前向声明。但since std::string is a typedef, you can't forward declare it,你必须加入它。
我确信您正在尝试按照建议尝试#include
尽可能少,但在这种情况下您无法遵循它。
答案 2 :(得分:2)
std :: string在std命名空间的<string>
头文件中定义。你必须把它包括在内。
答案 3 :(得分:2)
您可以通过在包含其他头文件之前在实现文件中包含必要的文件来确保满足所有依赖项,即确保#include <string>
出现在实现文件(.cpp)的第一行之前,包括你自己的头文件。
这不是最佳做法。所有头文件都应该满足自己的依赖关系,因此头文件的用户不需要关心依赖关系。至少那是我的拙见。
答案 4 :(得分:1)
您可能听说在标头中使用using namespace std;
是不明智的,这是正确的,因为包含该标头的任何内容都会被全局命名空间中的所有内容所困扰。包含您需要的头文件是完全可以接受的。
答案 5 :(得分:1)
不幸的是你不能绕过它。
即使你的班级定义如下:
class A {
private:
std::string* id;
public:
void f();
};
然后你仍然没有多少能做,因为前方声明std::basic_string<char, etc>
是痛苦的屁股。我甚至都不去示范。
幸运的是,虽然标题中的using namespace std
是明确的禁忌,但您通常可以在自己的标题中使用#include
标准标题,而不必担心它。
答案 6 :(得分:-2)
可能有些疯狂的extern
声明会有所帮助,但这不是一种方法。为什么不想包含在头文件中?