2016-12-13 68 views
1

我在教授告訴我們uni和我在Stroustrup的書中讀到的內容之間有些混淆。C++頭文件和命名空間

  • 我們都知道,一個C++ header基本上是 聲明集合(在file.h中定義),他們可以包含例如 集合類。他們是非常有用的,因爲他們給我們一個 很多存儲在一個單一的空間功能

  • 命名空間是沒有定義成才發明來組織程序的一部分類,函數, 類型(...)類型。

我不能在這裏看到具體的區別,當我必須創建一個項目。


如果我有(例如),使該解決不同程度的方程的程序,我會把我需要在一個單一的文件中的類。例如,我將在equations.h所有這些東西中放置:class secondDeg,class ThirdDeg,class fourthDeg等。

爲什麼要使用命名空間呢?

答案(我猜)是:因爲你可以給一個更好的組織命名(參見std :: cin)。但在這種情況下,我應該

  1. 創建equations.h(或其他)
  2. 創建例如
  3. 稱爲eq把我的班命名空間中的

這是真的necassary命名空間?我不能只使用頭文件並把我所有的類放在裏面嗎?

回答

3

你似乎在混淆兩個不同的概念。標題是一個文件,通常用於包含聲明。它可以包含函數聲明,類,模板等。

命名空間是一種定義範圍的方法,其中聲明的所有項目都是唯一的。這使您可以使用功能和類別名稱,否則可能與標準名稱衝突。例如

namespace mystuff 
{ 
    class list { }; 
}; 

您的列表不會與std :: list衝突。

命名空間可以和應該在頭文件中用來聲明這些類,並且它們是該命名空間的一部分。但是,正如其他人所指出的,在頭文件中使用'using'指令是不鼓勵的,因爲它可以創建名稱空間打算解決的名稱衝突。

+0

這ispira正是我需要的答案,我真的有現在的區別。在你的例子中,你可以調用mystuff :: list,而不會遇到標準庫的問題。謝謝! –

6

這真的很荒謬嗎?

這要看情況。更好和更明確的選擇是將您的聲明嵌入namespace

我不能只使用一個頭文件並把所有的類放在裏面嗎?

當然,你可以,只是避免在全球(::)範圍內聲明的符號任何衝突和頭文件從using namespace <xxx>;避免。

+0

所以一個命名空間就像一個java包? –

+0

@RaffaeleRossi不知何故,是的。 –

+0

好的很有幫助,我想我已經想通了。您建議不要在標題中使用名稱空間以避免與全局範圍中的符號發生衝突? –

7

爲什麼要使用命名空間呢?

命名空間可以包含多個標題,例如,namespace std包括從<vector><list>定義等

您可以定義自己的namespace不污染全局命名空間,避免衝突。將命名空間限制在最小值是您的最佳選擇,因此通常可以避免使用using namespace std;