2010-05-14 95 views
5

我有一個關於在C++代碼中包含多頭文件的問題。頭文件C++的多個包含文件

說例如,我有三個類,X,Y,Z。 X和Y是從基類Z中派生出來的。我想在Y中創建一個X的實例。代碼將如下所示。

class Z{some code} 

class X:public Z{some code};//here #include header of class Z added 

class Y:public Z //here #include header of class Z added as well as of X class 

{private: 
    X* mX;//instance of X 

some code}; 

所以在這個基類的所有方法的多重定義出現。我如何應付這個問題

+0

可能重複的[重定義c + +](http://stackoverflow.com/questions/2823330/redefinition-c) – 2010-05-14 05:46:26

回答

8

使用「包括衛士」(Wikipedia link

#ifndef MYHEADER_H 
#define MYHEADER_H 

// header file contents go here... 

#endif // MYHEADER_H 

這是慣用的代碼,由經驗豐富的任何C和C++程序員容易辨認。將MYHEADER_H更改爲特定的內容,例如,如果標題定義了一個名爲CustomerAccount的類,則可以調用警衛CUSTOMERACCOUNT_H


在您的具體情況下,請爲每個類分別創建一個頭文件/源文件。用於Z類的頭文件將有一個包括後衛:

#ifndef Z_H 
#define Z_H 

// Code of Z class 

#endif Z_H 

現在,無論是X的頭和Y可以包括z.h安全 - 它只會真正的.cpp文件包括x.h並計入一次y.h並且不會發生重複。

請務必記住,在C和C++中真正編譯的是源文件(.c或.cpp),而不是頭文件。頭文件只是由預處理器「複製粘貼」到include這些源文件中。

+0

你可以請更具體的我的例子如果你不介意。 – boom 2010-05-14 05:40:35

+0

@iSight:已更新。這夠了嗎? – 2010-05-14 05:48:50

+0

很多很多thanx。它解決了。 – boom 2010-05-14 06:05:20

1

您可以使用所謂的包括守衛或標頭警衛。他們走這樣的事情:

// within some_header.h 
#ifndef SOME_HEADER_H 
#define SOME_HEADER_H 

// stuff goes here 

#endif 

本質上,第一次圍繞宏沒有被定義,所以裏面的一切都包括在內。但是,第一次後續包含將不起作用。

與所有命名方案一樣,命名方案完全是任意的,由您決定。我喜歡以這種方式將文件名至少包含在內,就像我上面所做的那樣。我還在我的真實項目中包含名稱空間和項目名稱。

有幾件事值得注意。你可能會試圖做這樣的事情:

#define _SOME_HEADER_H__ 

混淆它一下。但是,以下劃線開頭,後跟大寫字母或包含雙下劃線的名稱是保留的標識符,並且您不能使用它們。

3

您還可以使用#pragma一次預處理器指令在頭文件中。 (不需要打擾#ifndef #define #endif)

+0

在基類頭或派生類頭中使用此指令的位置。 – boom 2010-05-14 11:49:36

+0

@iSight需要定義所有(基類和派生)類頭文件 – santhosh 2010-05-15 12:17:09

+0

+1 #pragma一次 – hyde 2013-07-20 08:49:47