标题包含顺序混淆

时间:2016-12-29 18:47:47

标签: c++ header header-files

我有一个名为Person.h的头文件:

class Person
{
    public:
        Person();
    private:
        std::string name;
};

实现位于名为Person.cpp的文件中:

#include <string>
#include "Person.h"

Person::Person()
{
    name = "foo";
}

我过去常常避免使用嵌套的包含文件,因此在将类标题包含在类源文件中之前我#include - <string>标题。

现在这不会编译,std::string不是定义的名称。但如果我在头文件中包含它编译。

在网络上,我发现包括标题,注意包含的顺序(这是我经常在C,我的主要语言)确实应该工作(包含文件不是自己编译,而是只插入源代码文件)。

所以我的问题是,为什么不编译而不在头文件中包含字符串头?因为头文件是&#34;复制粘贴&#34;进入 #include <string>之后的源文件,我希望它编译得很好。

3 个答案:

答案 0 :(得分:3)

问题是标题必须包含它所依赖的类型定义的标题,或者只需要指针作为引用的正向声明类型。

<string.h>包含在您的头文件中以解决此问题。

您无需担心多个内容,因为所有标准标头都使用Inclusion Guards。您还需要在自己的标题中添加包含保护。

  

[需要查看前向声明]在C中是相同的。但它应该从cpp文件中包含的头文件中获取它们。

除了Person.h之外,还有其他地方可以包含Person.cpp标头文件。这就是触发错误的原因。

答案 1 :(得分:1)

最好在该类的头文件中包含您的类的所有相关标头。选择不这样做需要你记得在使用你的类的每个其他文件中包含必要的标题,并且当你向类中添加新功能,因此需要额外的标题时,你必须访问每个地方已包含您的类标题,并为每个文件添加正确的标题。

答案 2 :(得分:0)

您希望使用标准头文件和其他所有人include guards

#ifndef PERSON_H
#define PERSON_H

/// your header file

#endif // PERSON_H