2011-05-22 190 views
4
class A{ 
private: 
    std::string id; 
public: 
    void f(); 
}; 

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

回答

10

在这种情况下,您必须包含<string>才能使用std::string

只有当您只使用标题中对象的引用或指针时,才能避免#including标题。在这种情况下,您可以使用前向声明。但是since std::string is a typedef, you can't forward declare it,你必须包括它。

我确定你正试图按照建议尽量少尝试#include,但在这种情况下你不能遵循它。

+0

只要您知道,如果您使用内联markdown语法,则可以确保代码示例不会被解释为HTML,因为括号中的内容。用反引号('\'')来包围这个短语。 – 2011-05-22 16:10:52

+0

@Cody Gray:非常感谢!我不知道。 – 2011-05-22 20:09:22

2

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

-2

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

+0

其实它很好,但我听到这样的方式是不推荐。 – thetux4 2011-05-22 13:21:12

+0

不建议使用'using namespace std'和类似的命令。你可以在你的头文件中包含任何头文件,它不会造成任何麻烦。 – 2011-05-22 13:23:59

+0

包含'.c'和'.cpp'是错误的,没有包含警卫会导致错误,如果它包含两次,但在这里都不适用。您使用它,您需要声明 - 该声明位于标题中。期。 – delnan 2011-05-22 13:24:28

1

您可能已经听说在标头中使用using namespace std;是不明智的,因为包含该标头的任何内容都会与全局名称空间中的所有内容紧密相连。包括你需要的头文件是完全可以接受的。

11

将标题包含在其他标题中是完全必要的。尽可能减少它是明智的,但从根本上说,如果你的课程取决于std::string,那么你别无选择,只能在#include <string>的标题中找到答案。另外,取决于任何和/或所有标准类别绝对没有错 - 毕竟,它们被授权在任何实现中提供。这是using namespace std;这是皱起了眉头。

2

通过在包含其他头文件之前在实现文件中包含必要的文件,即确保#include <string>出现在实现文件(.cpp)的第一行,然后包含您自己的头文件文件。

这不完全是最佳做法。所有的头文件都应该满足它们自己的依赖关系,所以头文件的用户不需要关心依赖关系。至少这是我的愚见。

1

不幸的是,你无法绕过它。

即使你的类定义是这样的:

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

那么还是有没有什么你可以做,如前宣布std::basic_string<char, etc>是一个痛苦的屁股。我甚至不打算演示。

幸运的是,虽然头文件中的using namespace std是一个明确的禁忌,但您通常可以在标头中使用标准头文件,而不用担心它。