2013-11-03 45 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指令的時間,地點和次數感到困惑。 –