2013-11-05 37 views
3

我是一名新程序員,遇到了一個情況,我需要創建幾個(2-4)與我的其他類密切相關的小函子類。主類叫做GraphicsRenderer,它基本上是OpenGL的一個包裝器,它將所有的OpenGL API調用完全封裝在一個編譯單元中。因爲所有的函數都只存在於GraphicsRenderer類中,所以我正在考慮聲明它們在GraphicsRenderer.h頭文件內..多個小仿函數類的共享頭文件?

我知道'規則'通常每個頭文件只有一個類聲明..所以我應該在哪裏聲明函子..?

  • 爲每個函子類分別生成.h和.cpp文件? (所有這些都必須包含API調用..)

  • 聲明/定義與GraphicsRenderer類相同的文件中的所有函子類? (它將所有的API調用保留在相同的編譯單元中)。

  • 或者這是名稱空間的好地方嗎?關於嵌套類聲明(即:聲明GraphicsRenderer類聲明中的刪除函數)?

回答

2

除了有更少的文件,你不會從保持每個類在一個單獨的.h/.cpp文件丟失了。我建議每個文件有一個類。

話雖如此,您仍然可以將頭文件合併到一個共同的頭文件中,其中包含所有其他.h文件,這將使API用戶更方便。假設您的GraphicsRenderer僅適用於仿函數,您甚至可以將它們的.h文件包含到GraphicsRenderer'h頭文件中。

至於名稱空間,不同的團隊對它們有不同的約定。我更喜歡使用命名空間來防止API衝突 - 我通常爲大面積的粘性API保留單個命名空間。我已經看到其他團隊每個班級幾乎都有一個名字空間。

1

如果你的仿函數不是模板,申報接口的.h文件中,就像這樣:

文件.H:實施

class GraphicsRenderer { 
    void someApiCall(); 
    void someOtherApiCall(); 
}; 

文件的.cpp:

#include <GL.h> 

GraphicsRenderer::SomeApiCall() { 
    //Implementation goes here. 
} 

如果你打算一起使用它們並且它們足夠小,那麼在單個頭文件中打包某些類就沒有問題。例如,stl庫有一個utility標題和一個類的集合。

但是要實現和接口爲單獨的越好,所以不執行內聯函數,在.cpp文件落實,並使用forward declarations可能當在.h文件中儘可能擺脫#include S,。這也改善了編譯時間。

唯一的例外是當你使用模板,但即使這樣做,我建議您分割的文件是這樣的:

在MyFile的。.h文件:

template <class T> 
class MyClass { 
public: 
    template <class U> 
    void apiCall(U u); 
}; 

#include "MyFilePriv.h" 

MyFilePriv.h與實施:

template <class T> 
template <class U> 
MyClass<T>::apiCall(U u) { 
    //Implementation goes here. 
} 

即使模板並不意味着是單獨編譯,這使得它更容易閱讀界面文件和靜止隱藏實現細節,至少對於開發者來說。