2016-03-15 40 views
0

我對C++的很多領域還是一個新鮮的東西,其中一個就是一般的.cpp和.h文件組織。有沒有辦法定義在單獨的.h和.cpp文件中的名稱空間中聲明的函數?

我正在用一些結構和函數創建一個名稱空間。我想宣佈在.h文件中function.h與此類似

//objectname.h 
namespace ObjectName 
{ 
    Object Function(arguments); 
} 

聲明的命名空間

//function.h 
//includes declarations used in the function definition as well 
//as possibly a redundant function declaration. 
Object Function(arguments); 

然後在function.cpp定義

//function.cpp 
#include "Function.h" 
Object Function(arguments) 
{ 
    .... 
} 

使您可以抽象地看到objectname.h中的名稱空間,函數function.h中的特定聲明和function.cpp.中的函數定義一如往常,任何s uggestions非常感謝。 (也基於Windows的c + +)

+0

也爲此證明一些原因,是這樣的。這些方法相當長,只是解析數據。我認爲在命名空間中爲每個方法配置一個.h/.cpp對是合適的。對於一般的文件保存,以該方法命名該文件。 –

+1

對於函數,使用名稱空間的範圍映射非常類似於對類進行範圍映射,特別是'靜態'類函數。換句話說,您需要實際指定命名空間範圍。 –

+0

所以我需要對'function.h'和'function.cpp'文件進行修改?我是否應該使用完全限定名稱在相應的文件中聲明/定義它們?就像在'function.h'' Object ObjectName :: Function(arguments);'? –

回答

2

這是罰款

//objectname.h 
namespace ObjectName 
{ 
    Object Function(arguments); 
} 

你不需要function.h可言。如果你想命名空間分割成幾個文件,你會做這樣的:

//function.h 
//includes declarations used in the function definition as well 
//as possibly a redundant function declaration. 
namespace ObjectName 
{ 
    Object Function(arguments); 
} 

換句話說,你需要重新包裝命名空間中的聲明。 (這是一個進步的話題我不會做它。)

Function.cpp只需說功能是定義:

//function.cpp 
#include "ObjectName.h" 
Object ObjectName::Function(arguments) 
{ 
    .... 
} 

注意,語句中使用頭文件是#include,而不是using

+0

好的,這個工程。我可以格式化該項目,因爲我想擁有一個單獨的(但冗餘的)文件。正如我所說的,其原因僅僅是通過對稱性使用類似的函數聲明來簡化我的操作,即使它本身並不需要它。基本上每個對象在項目中都有一個.h和.cpp文件(除了名稱空間,沒有.cpp)。 –

0

這不是它是如何工作的:你的function.h在全局命名空間中定義了另一個Function。具有兩個具有相同名稱的函數正是命名空間的用途 - 如果在任何其他庫中已經存在Function,則庫寫入不需要擔心。

並且由於您的.cpp僅定義了兩個Function之一,另一個未定義,因此在調用時會出現鏈接錯誤。

請注意,您不需要一次性「定義」一個名稱空間。以例如namespace std爲例,其內容在例如<vector>,<list><iostream>。這是可能的,因爲與類不同,名稱空間可以重新打開。 namespace N { int x; } namespace N { int y; }有效。

+0

好吧,但如果我想保留一個.h文件與所有聲明在一個地方,我可以使用#pragma一次?還有關於頭文件和.cpp中的定義和聲明? –

+0

@marshalcraft:'#pragma once'是一個頭部守衛的不可移植替代品,而不是讓你的代碼突然有另一種含義的魔術。至於.cpp文件中的頭文件和定義中的聲明,是的,這仍然完全適用。 – MSalters

相關問題