2011-02-07 125 views
7

我是新來的C/C++,我感到困惑如下:C++包括插頭問題

  1. 我是否應該把類聲明在其自己的頭文件,和實際執行中的其他文件?
  2. 是否應該在example.h文件或example.cpp文件中放置像<iostream>這樣的頭文件?
  3. 如果所有的類都需要使用<iostream>,我包括類的頭文件到另一個類的頭,莫非我包括<iostream>兩次?
  4. 如果我使用了很多STL課程,使用std::有什麼好的做法?
+1

#4是明顯的,應該有自己的問題 – Cameron 2011-02-07 01:37:02

+0

這些都是體面的問題,但將它們合併爲一個「過於寬泛」。 – 2011-02-07 01:51:47

回答

8

1.Whether我應該把類聲明在其自己的頭文件, 和實際執行中的另一個 文件?

如果您正在操作模板,則可以在相同的頭文件中分別編寫類的定義和類成員的定義。另外,如果你想讓你的成員函數內聯,你可以在類定義本身內定義它們。在任何其他情況下,最好將類的定義(.hpp文件)和類成員的定義(.cpp)分開。

2.我是否應該在example.h文件或example.cpp 文件中放置標題?

它取決於如果您需要在example.h文件或您的.cpp文件中的這些標頭。

3,如果所有的類都需要使用,我包括類的頭文件到另一個 類的頭,莫非我 包含了兩次?

它發生,如果你不通過下面的宏包裝你的類定義:5,如果我用了很多STL類

#ifndef FOO_HPP 
#define FOO_HPP 
class { 
... 
}; 
#endif 

,什麼是使用std一個很好的做法: :?

我認爲這是更好時,你可以使用每次std::而不是using namespace std。這樣,您將只使用您需要的名稱空間,並且您的代碼將更具可讀性,因爲您將避免名稱空間衝突(想象兩個名稱相同且屬於兩個不同名稱空間的方法)。

但最重要的是問題4在哪裏呢?

1

通常,您將類聲明(包括成員聲明)放入源文件中的頭文件和成員函數(方法)的定義中。標題通常有名稱,如*.h*.hpp。至於第3點,你應該在你的頭文件中加入守護進程,這樣他們可以安全地包含在同一個源文件中多次;那麼你可以將它們包含在你需要的任何地方。我不明白第5點:你在問什麼時候使用std::命名空間資格?

1

對於 「包含了兩次」 的問題,這裏是你的頭文件一個共同的模式:

// _BLAHCLASS_H_ should be different for each header, otherwise things will Go Bad. 
#ifndef _BLAHCLASS_H_ 
#define _BLAHCLASS_H_ 

... rest of header ... 

#endif 
+4

以兩個下劃線開頭的名稱是爲編譯器實現保留的;你應該使用不同的模式作爲你的守衛(例如`BLAHCLASS_H_INCLUDED`)。 – 2011-02-07 01:39:42

+1

同意一般觀點,但與使用雙下劃線的人有什麼關係(我在任何地方都可以看到)。這些名稱是否保留用於實現? (他們看起來也很難看) – 2011-02-07 01:40:59

2
  1. 一般情況下,是的。它有助於組織。但是,對於小項目來說,這可能不是什麼大問題。

  2. 我無法理解這裏的問題。如果您詢問在何處放置#include指令,則實現文件應包含頭文件。

  3. 是的,但使用的include guards防止多個包裹。

1
  1. 只要他們沒有模板,一般是。模板(好或壞)必須放在標題中。
  2. 我寧願讓我的每一個標題「獨立」的,因此,如果需要任何其他頭爲它的運行,它包括頭部本身(例如,如果我有一個使用std::string類,這個類的標題將#include <string>
  3. 號少數特殊的例外,需要標準頭寫的那麼你可以不止一次包括他們沒有它改變任何東西(主要的例外是assert.h/cassert,它可以使上包括多一次)
  4. 我不確定你在問什麼,如果你問的是使用指令如using namespace std;,那麼它的一般是(儘管普遍不是)不喜歡。像using std::vector;這樣的使用聲明通常被認爲不太成問題。
2
  1. 您通常應該這樣做,但對於相對較小的項目,您可能儘可能避免使用實施文件;
  2. 如果您的標題僅使用<iostream>中的不完整類型,則可以避免包含它,但這些類型需要forward declarations(請參閱When to use forward declaration?)。然而,爲了簡單起見,如果類型使用模板,我通常會包含相應的標題;
  3. 編號include guards保證在同一個translation unit中只包含一個標頭;
  4. 一個常見的良好做法是不要將using namespace std放在頭文件中。請注意命名空間衝突;