2009-10-16 56 views
9

在多個源文件上實現單個類(一個.h)是否有任何問題?我意識到這可能是單個類中代碼太多的症狀,但是在技術上有沒有什麼問題?具有多個實現文件的一個類

例如:

foo.h中

class Foo 
{ 
    void Read(); 
    void Write(); 
    void Run(); 
} 

Foo.Read.cpp

#include "Foo.h" 
void Foo::Read() 
{ 
} 

Foo.Write.cpp

#include "Foo.h" 
void Foo::Write() 
{ 
} 

Foo.Run.cpp

#include "Foo.h" 
void Foo::Run() 
{ 
} 

回答

13

這很好。最後,它將全部聯繫在一起。

我甚至看過代碼,其中每個成員函數都在不同的* .cpp文件中。

+1

這會驅使我batty。我確定偶爾有很好的(或至少是體面的)理由來做到這一點,但從試圖理解對象模型的角度來看,bleah ......必須跳轉文件以遵循方法。 – Joe 2009-10-16 15:23:44

+1

如果您構建一個庫,將每個函數和全局分割到它自己的對象中,使得消費者只能鏈接它們引用的位,而不會再引用它們。雖然這很煩人。 – ephemient 2009-10-16 15:30:59

+1

@ephemient:爲什麼這很重要?鏈接器不能刪除你不使用的功能嗎?還是僅僅爲了改善鏈接時間? – 2012-11-07 22:01:18

4

不,沒有什麼技術上的錯誤。鏈接器將把所有的Foo作品放在最後的二進制文件中。

1

我一直在使用Apache Portable Runtime,它幾乎完成了這件事。你有一個頭文件,說apr_client.h和該頭文件中的函數的多個實現文件 - 每個文件代表客戶端操作的一個方面。這沒有錯,這並不是很不尋常。

這可能是太多的代碼在一個類

C++是不是Java的症狀,所以你不必根據你的類名來接你的文件名。

0

這是合法的,事實上像C#這樣的新語言一直在做這種事情。

6

這是合法的,它有一些(!?)的優點...

如果這個類的靜態庫鏈接的可執行文件,只有使用的功能會得到,這是有限的非常方便資源系統。

您還可以隱藏某些功能的實現細節。兩個人可能在不知道彼此的情況下實施一部分課程。方便國防部項目。

如果你看任何CRT源代碼,你會看到相同的模式...

+1

重新隱藏同一個類的實現細節的重點確實在擴展它。如果你有一門可以輕鬆拆分的課程,那麼它應該是兩門課,而不是一門課。 – 2009-10-16 17:53:49

+0

@理查德:呃,我只想說你可以做到,你不必這樣做。如果功能如此簡單,那麼你可能不喜歡爲它創建一個單獨的類... – Malkocoglu 2009-10-16 18:03:53

+1

@Richard - 呃? - 例如foo :: read foo :: write foo :: ioctl的「設備」怎麼樣?縮短構建時間的好處是什麼? – pgast 2009-10-16 21:02:15

2

這是完全合法的。所有的cpp文件將被鏈接在一起。

如你所說,這對於使一個非常大的實現文件更具可讀性是有用的,因爲每個cpp文件都是一個編譯單元,所以你可以(ab)使用這個事實。 (例如未命名的命名空間)

+0

+提到增加內部聯繫的機會 – 2016-02-14 20:55:23

0

有兩點可能值得考慮。

類廣泛的優化:

如果編譯器具有所有它可見成員函數時,其分析文件(假設單個TU編譯器),那麼它可以是能夠在不同的部件之間進行的優化功能。

代碼審查

如果所有的一類定義在同恩,那麼這使得手動代碼審查更容易。如果將定義分解爲不同的TU,那麼由於需要搜索適當的文件,因此可以顯着增加手動審閱所需的工作量,並且可以在窗口之間不斷輕彈以獲取「整個」圖片。

相關問題