2013-11-03 44 views
0

Person.h为什么这个头文件编译时缺少#include?

#ifndef PERSON_H_ 
#define PERSON_H_ 

/* Person.h */ 

class Person { 
    int age; 
    std::string name; 

    public: 
    Person(int, std::string); 
    std::string getName(); 
    int getAge(); 

}; 

#endif /* PERSON_H_ */ 

的人(INT的std :: string)函数的声明使用的std :: string的名字,但我还没有在头文件中包含它。因此,我希望编译器抱怨丢失的符号。但它编译并运行良好!为什么?

的代码的其余部分...

Person.cpp

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

Person::Person(int age, std::string name) 
{ 
    this->name = name; 
    this->age = age; 
} 

std::string Person::getName() 
{ 
    return this->name; 
} 

int Person::getAge() 
{ 
    return this->age; 
} 

Main.cpp的

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

int main() { 

    printFunc(); 

    Person chelsea_manning(5, std::string("Chelsea Manning")); 

} 

而且,我是新的C++,所以请让我知道如果你看到我的代码/ OOP有什么奇怪的地方。

+5

包含就像复制粘贴。看看将这些标题按顺序复制粘贴到你的cpp中就行了。 – chris

+1

尝试从main.cpp和person.cpp中删除'#include ',看看会发生什么;)。 – mfontanini

+1

尝试颠倒包含的顺序 – tay10r

回答

4

程序的编译从包含main函数的文件顶部开始(技术上,预处理器在编译程序之前运行,但它仍然在相同位置启动)。在你的情况下,它所做的第一件事是在该文件中包含<string>。那么它包括Person.h。由于已经包含<string>,因此字符串文件的所有内容都位于代码中的人员文件之前,并且所有内容都按正确的顺序进行声明。如果您在<string>之前包含Person.h,或者不包含在您的主文件中,则确实会收到编译错误。

#include方向的行为就像复制/粘贴:它从字面上读取<string>文件,并将其内容放入其包含的源文件中。接下来,对Person.h也做了同样的事情。所以运行预处理器后的最终结果是

<-- contents of <string> --> 
<-- contents of Person.h --> 

int main() 
... 

因此在您的示例中,所有内容都按正确的顺序声明。

+0

为了更精确一些,编译不包括'',预处理。 –

+0

@ChrisHayes Yup。修正了。 – ApproachingDarknessFish

+0

无论如何,在Person.h头文件中#include 是否是最佳实践?或者“复制”代码会不好?同样,对Person.cpp中的#include (它已经在main中定义)是否“坏”。换句话说,为什么不直接用主函数定义文件中的所有内容呢?我对我们应该使用#include指令的时间,地点和次数感到困惑。 –