2016-03-11 178 views
1

我有一個非靜態函數類。由於我的程序的體系結構,我認爲使用靜態函數會更好,因爲類只是一個實用程序。在某些情況下,我只需要該類的一個功能,所以我認爲不必創建該對象。基本上我有這個:靜態函數靜態函數

class StaticCall 
{ 
public: 
    StaticCall(){} 
    static int call_1() 
    { 
     std::cout << "In call 1" << std::endl; 
     call_2(); 
     return 0; 
    } 
    static int call_2(); 
    { 
     std::cout << "In call 2" << std::endl; 
     return 0; 
    } 
}; 
int main(int argv, char** argc) 
{ 
    std::cout << "Calling 1" << std::endl; 
    StaticCall::call_1(); 
    std::cout << std::endl; 
    std::cout << "Calling 2" << std::endl; 
    StaticCall::call_2(); 
    return 0; 
} 

它工作正常,但我想知道是否可以有任何問題與此方法。我可以通過使用名稱空間來實現相同的功能,因爲其他職位已經說過。但是因爲我已經有了課,我想用靜態函數來完成它。

+0

沒問題;來自'call_1'的'call_2'總是被正確地調用,因爲它們在同一個類 – nikniknik2016

+0

中沒有問題,唯一需要考慮的是在C++中,並非所有的東西都必須是類,並且可以爭辯說這個類不是最合適的爲這種情況構建。例如可以創建這個類的一個實例,即使它沒有意義。我至少會讓構造函數是私有的。 – user463035818

+1

具有純函數的命名空間將會很好。你根本不需要任何課程。經驗法則:當一個類中沒有數據成員時,使用純函數可能會更好。 – Jojje

回答

2

你在這裏做的是用一個類來封裝兩個方法 - 就像命名空間一樣。你基本上用一個類來替換名字空間的使用。

它工作嗎?是的,它確實!

可以這樣做嗎?那麼,從一個代碼維護/可讀性點,沒有那麼多,因爲:

  • ,你可以從一個類
  • 繼承你可以實例化一個類
  • 靜態方法不屬於任何一類實例,這可能會導致後續問題,特別是在擴展課程時。

如果你想要的只是封裝,或者不污染全局命名空間的方法 - 這就是爲什麼你有命名空間。

當您正確使用C++語言特性時,代碼更乾淨,更易讀,更簡單。