2010-04-29 46 views
6

假設我有一個類:C++ OOP:將哪些函數放入類中?

class a 
{ 
public: 
    void load_data(); 
private: 
    void check_data(); 
    void work_data(); 
    void analyze_data(); 
} 

這些功能都做的類或它的一個成員的東西。

但是這個功能:

bool validate_something(myType myData) 
{ 
    if (myData.blah > 0 && myData.blah < 100) 
    { 
     return true; 
    } 
    return false; 
} 
  • 是與階級,只會被它調用,這樣就不會被其他地方需要

  • 不會做任何事情與班級或其成員 - 只是一個小的「實用」功能

放哪裏validate_something?課內或課外?

+0

你可以使它成爲一個靜態成員 – Tim 2010-04-29 17:07:34

回答

4

讓它成爲私人的static class member。我曾經傾向於將這些非類成員放在實現文件中的無名稱名稱空間中,但似乎他們幾乎總是最終需要成爲類成員(或者需要將其移至其他地方 - 可能需要驗證庫,在你的例子中),隨着代碼的變化,所以現在我幾乎總是讓它們成爲靜態成員。

請注意使用「幾乎」在整個這個答案:-)

+1

爲什麼一個函數*需要*成爲一個靜態成員,而不是在impl文件中的無名稱命名空間?或者,您是否只需要這樣做就可以在需要獲取狀態數據時保存工作? – 2010-04-29 16:58:49

+0

爲什麼你讓它們成爲靜態成員而不是簡單的成員函數? – 2010-04-29 16:59:50

+0

@John根據我的經驗,實現文件中的幫助器函數幾乎總是最終需要遷移到類中。這是純粹的權宜之計。 – 2010-04-29 17:03:24

0

如果這個方法是一個只被這個類使用的實用程序,我會讓它成爲這個類的私有方法。這樣,它被封裝,而不是「污染」你的公共API。

0

假設是的myType也是一個結構/類,你爲什麼不使validate_something的的myType的方法預選賽?

0

據我所知,這不是一種方法。把它的定義放在cpp文件中,在使用它的方法的定義之上。如果您的所有方法定義內嵌在您的類中您必須將該函數的原型放在類定義上方的標頭中,但定義仍可以位於cpp文件中。

10

如果函數是

  • 不是類的外必需的,並且,
  • 不需要訪問類成員(或者也許是有道理的作爲遊離函數成員作爲參數)

然後我傾向於使它在實現文件中的私有名稱空間內的一個自由函數。我更喜歡不使用私有函數,因爲它們在頭文件中公開實現細節(並且還沒有遇到Neil的問題),我更願意避免爲實現更改重新編譯。