簡體   English   中英

輔助工具的靜態自由函數或成員函數?

[英]static free functions or member functions for helpers?

假設您具有以下非靜態成員函數:

// .h
struct C {
    void f();
}

現在假設你想實現C::f使用特定於某些子功能C::f ,使其更短更易讀; 例如:

// .cpp
void C::f() {
    h1();
    h2();
    //...
    hn();
}

假設許多h()函數不需要訪問任何數據成員。 這意味着您可以將函數定義為靜態自由函數(在一個.cpp中)或作為成員函數(靜態或非靜態)。

你會讓它們成為靜態自由函數或C的函數成員嗎?

第一種情況的一個優點是您不必在C聲明它們:

// .cpp
static void h1() {//...}
static void h2() {//...}
static void hn() {//...}

此外,如果我沒有錯,則不存在全局命名空間污染的風險,因為它們是靜態的 ,即它們只能從同一單元.cpp內的其他函數中看到(其中C :: f也被定義)。

而在第二種情況下,你將不得不在C聲明它們,盡管如我所說,它們只應該被C::f

// .h
struct C {
    void f();
  private:
    static void h1(); // can be either static or non-static
    static void h2();
    static void hn();
}

// .cpp
void C::h1() {//...}
void C::h2() {//...}
void C::hn() {//...}

我認為第二個版本導致膨脹的代碼是沒有充分理由的,最重要的是如果您最終必須拆分其他長成員函數(如C::f以使代碼更具可讀性。

我建議使用匿名命名空間:

namespace {
    void C::h1() {/...}
    void C::h2() {/...}
    void C::h3() {/...}
}

(見這個問題

這樣,您可以保證函數在定義的文件之外可見,因此您絕不會污染您的全局命名空間 - 這將是我對自由靜態函數的主要關注。

使它們成為類的私有成員會向全世界公開函數接口(當您發布* .h文件時),從而使接口更加復雜無緣無故。 (這里可以添加更多參數,例如更改私有函數定義時的更高編譯時間)

搜索“匿名命名空間”會導致對此主題進行一些有趣的討論。

只有你可以回答這個問題。 如果它們永遠不會在C::f之外使用,那么污染全局命名空間就沒有意義了。 我個人會把它們變成C成員函數。 如果它們可以被標記為靜態,那么這樣做,但是如果它們真的只對f很重要,那么只需將它們命名為指示它的東西,並且不要擔心static

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM