2013-07-08 80 views
1

可能重複全局函數靜態方法:
Namespace + functions versus static methods on a classC++:VS VS命名空間VS

哪裏是寫,例如最明智的辦法,一個函數,看起來像

Point intersection(const Line &L1, const Line &L2);

(假設我已經寫了類PointLine)?

也許我可以使這個問題更確切的一點:我正在考慮以下選項:

  1. 寫全局函數(在line.h宣佈,它在line.cpp寫)
  2. 編寫該類的靜態方法Line
  3. 使用命名空間。
  4. 寫,而不是一個功能Point Line::intersection(const Line & otherLine);

我是最後一個選項不是一個球迷,因爲我不希望我的功能是「非對稱」(我有這樣的功能的其他幾個例子在我的代碼)。目前它們是全球性的功能(如選項1),但我明白這不是「良好的做法」。至於靜態方法和命名空間,我還不熟悉這些,所以我不確定。

您認爲什麼是「最佳」設計?

感謝您的見解!

編輯:給你一個我的項目規模的想法:50到100個班。

回答

3

這真的取決於你想要做什麼。如果你只是寫一個非常小的程序,我並不認爲把它寫成一個全局函數會有什麼問題。但是,如果程序的大小至少適中,我會建議使用靜態方法,因爲您會將其功能與其處理的類分組。

當然,你也可以用Namespace來做到這一點。然而,我想你會有一個Line類,因爲它看起來很適合面向對象的編程風格。考慮到這一點,我真的不覺得有理由讓它成爲命名空間,而不是類Line的靜態方法。如果我正在尋找交叉點方法,那當然是我首先要看的地方!

我沒有看到最後一個選項有什麼問題,但我更喜歡#2。

+0

另一種方法是去與#2,但反轉的類。取決於你的設計。 Point Line :: intersection(const Line &L2); // L1是你打電話給 – MichaelH

+0

的線對象謝謝,我想我可能會使用靜態函數然後 – Seub

2

如果您的項目足夠小,可以使用PointLine之類的名稱,而不必將它們放在命名空間中,那麼可以使用intersection()函數執行相同的操作。請注意,重載解析意味着您可能不會在函數名稱上出現任何名稱衝突(但可能在類名稱上)。

如果您的項目是非平凡的大小,那麼將類函數放在同一個命名空間中是值得的。參數依賴查找意味着你的類的客戶將獲得交集功能時,他們使用Line類型的對象作爲參數:

void f(MyGeoLib::Line l1, MyGeoLib::Line l2) 
{ 
    MyGeoLib::Point p = intersection(l1, l2); //just works 
} 
+0

感謝你。你如何看待靜態方法雖然? – Seub

+0

我認爲在這種情況下,一個靜態方法實際上是違反直覺的,相交是「像一個運算符」,必須使用類名('Line :: intersection(l1,l2)')對我來說很直觀 不要讓它成爲一個成員(不管它是否是靜態的)的一個好理由是你可能想要其他的重載沒有相同的參數類型:'intersection(Line,Surface)'應該是part線或Surface界面?我的答案是:既不是,它是你的幾何庫的一個接口。 – dhavenith