5

次の非静的メンバー関数があるとします。

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

C::fここで、に固有のいくつかのサブ関数を使用して実装しC::f、短くして読みやすくしたいとします。例えば:

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

これらのh()の関数の多くは、データメンバーにアクセスする必要がないとします。これは、関数を静的フリー関数(1つの.cpp内)またはメンバー関数(静的かどうか)として定義できることを意味します。

それらを静的フリー関数またはCの関数メンバーにしますか?

最初のケースの利点の1つは、次のように宣言する必要がないことですC

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

また、私が間違っていなければ、グローバルな名前空間の汚染のリスクはありません。静的であるため、つまり、同じユニット.cpp(C :: fも定義されている)内の他の関数からのみ見ることができます。

2番目のケースでは、で宣言する必要がありますが、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() {//...}

2番目のバージョンでは、理由もなくコードが肥大化すると思います。とりわけC::f、コードを読みやすくするために、他の長いメンバー関数を分割する必要がある場合はなおさらです。

4

2 に答える 2

3

匿名の名前空間を使用することをお勧めします。

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

この質問を参照してください)

そうすることで、関数が定義されたファイルの外部に表示されないことを保証します。したがって、グローバル名前空間を汚染することはありません。これは、無料の静的関数に対する私の主な関心事です。

それらをクラスのプライベートメンバーにすると、関数インターフェイスが(* .hファイルを公開するときに)全世界に公開されるため、理由もなくインターフェイスがより複雑になります。(ここに追加できる引数は他にもあります。たとえば、プライベート関数の定義を変更する場合のコンパイル時間が長くなります)

「匿名の名前空間」を検索すると、このトピックに関する興味深い議論が発生します。

于 2012-09-04T03:39:22.360 に答える
1

あなただけがこの質問に答えることができます。それらが外部で使用されることがない場合は C::f、グローバル名前空間を汚染する意味はありません。私は個人的にそれらをのメンバー関数にしCます。静的とマークできる場合はそうしますが、本当に重要fなのはそれを示す名前を付けるだけで、心配する必要はありませんstatic

于 2012-09-04T03:33:15.580 に答える