我是新來的C/C++,我感到困惑如下:C++包括插頭問題
- 我是否應該把類聲明在其自己的頭文件,和實際執行中的其他文件?
- 是否應該在example.h文件或example.cpp文件中放置像
<iostream>
這樣的頭文件? - 如果所有的類都需要使用
<iostream>
,我包括類的頭文件到另一個類的頭,莫非我包括<iostream>
兩次? - 如果我使用了很多STL課程,使用
std::
有什麼好的做法?
我是新來的C/C++,我感到困惑如下:C++包括插頭問題
<iostream>
這樣的頭文件?<iostream>
,我包括類的頭文件到另一個類的頭,莫非我包括<iostream>
兩次?std::
有什麼好的做法?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在哪裏呢?
通常,您將類聲明(包括成員聲明)放入源文件中的頭文件和成員函數(方法)的定義中。標題通常有名稱,如*.h
或*.hpp
。至於第3點,你應該在你的頭文件中加入守護進程,這樣他們可以安全地包含在同一個源文件中多次;那麼你可以將它們包含在你需要的任何地方。我不明白第5點:你在問什麼時候使用std::
命名空間資格?
對於 「包含了兩次」 的問題,這裏是你的頭文件一個共同的模式:
// _BLAHCLASS_H_ should be different for each header, otherwise things will Go Bad.
#ifndef _BLAHCLASS_H_
#define _BLAHCLASS_H_
... rest of header ...
#endif
以兩個下劃線開頭的名稱是爲編譯器實現保留的;你應該使用不同的模式作爲你的守衛(例如`BLAHCLASS_H_INCLUDED`)。 – 2011-02-07 01:39:42
同意一般觀點,但與使用雙下劃線的人有什麼關係(我在任何地方都可以看到)。這些名稱是否保留用於實現? (他們看起來也很難看) – 2011-02-07 01:40:59
一般情況下,是的。它有助於組織。但是,對於小項目來說,這可能不是什麼大問題。
我無法理解這裏的問題。如果您詢問在何處放置#include
指令,則實現文件應包含頭文件。
是的,但使用的include guards防止多個包裹。
std::string
類,這個類的標題將#include <string>
。assert.h
/cassert
,它可以使上包括多一次)using namespace std;
,那麼它的一般是(儘管普遍不是)不喜歡。像using std::vector;
這樣的使用聲明通常被認爲不太成問題。<iostream>
中的不完整類型,則可以避免包含它,但這些類型需要forward declarations(請參閱When to use forward declaration?)。然而,爲了簡單起見,如果類型使用模板,我通常會包含相應的標題;using namespace std
放在頭文件中。請注意命名空間衝突;
#4是明顯的,應該有自己的問題 – Cameron 2011-02-07 01:37:02
這些都是體面的問題,但將它們合併爲一個「過於寬泛」。 – 2011-02-07 01:51:47