2017-04-16 94 views
3

很抱歉,如果這是一個愚蠢的問題,但我學習C++(我一般用C代碼),我不知道如何使用命名空間和類。他們必須在頭文件中聲明嗎?我如何在名稱空間中聲明函數?假設我正在處理一個包含不同文件的大型項目。我定義在文件中的命名空間,但是再要更多的功能添加到同一個命名空間,但這些功能在另一個文件中定義。可以這樣做嗎?例如:如何使用命名空間和類?

file1.cpp

namespace Example { 
    int vartest; 
    void foo(); 
} 

file2.cpp

int othervar; 
void otherfoo(); // How can I add this and othervar to the Example namespace? 

謝謝!

+0

命名空間既然你來自C,你可能會發現匿名命名空間可以替代'static'。 'namespace {bool Ireturntrue(){return true; }}現在很好地被隔離開來,並且在鏈接時不會增加名稱污染。 – user4581301

回答

4

只需聲明它同樣「名」的等效 namespace

file1.cpp

namespace Example { 
    int vartest; 
    void foo(); 
} 

file2.cpp

namespace Example { 
    int othervar; 
    void otherfoo(); 
} 

命名空間合併。

他們有在頭文件中聲明?

不可以。您可以在namespace內聲明任何namespace。 (請注意,「全球範圍」也是namespace

如何在命名空間中聲明函數?

只需在namespace內聲明。正如你所做的那樣。

並且我們假設我正在處理一個包含不同文件的大型項目。 我定義在文件中的命名空間,但後來想更多 功能添加到同一個命名空間,但這些功能在 另一個文件中定義。可以這樣做嗎?

合併相同名稱空間內同名的命名空間。

namespace X { void foo(){} } 
namespace X { void foo(){} } //Error, redefinition of `foo` because the namespace ::X is merged 

namespace X { void foo(){} } 
namespace Y { void foo(){} } //Ok. Different name spaces... 

namespace X { void foo(){} } // ::X 
namespace Y { void foo(){} } // ::Y 

namespace Y { 
    namespace X { // namespace ::Y::X here isn't same as ::X 
    void foo(){} //OK 
    } 
} 

召回了所謂的 「全球範圍內」,實際上是被稱爲global namespace

+0

爲全局命名空間上的最後一個註釋加1。 – 0xDEFACED