2012-10-04 9 views
12

C++でクラスのヘルパーメソッドを記述するとき、ヘッダー(.h)ファイルのクラスの定義でプライベートメソッドとして宣言する必要がありますか?たとえば:ヘルパー関数はヘッダーまたは実装ファイルに入れなければなりませんか?

/*Foo.h*/ 
class Foo { 

    public: 
     int bar(); 

    private: 
     int helper(); 
}; 
... 
/*Foo.cpp*/ 
... 
int foo::bar() { 
    int something = this->helper(); 
} 

int foo::helper() { 
    ... 
} 

または代わりに、それはクラスのプライベートメンバとして宣言し、代わりにそれの実装における自立機能作らない方が良いですか?実装ファイルに

/*Foo.h*/ 
class Foo { 
    public: 
     int bar(); 
}; 
... 
/*Foo.cpp*/ 
... 
int Foo::bar() { 
    int something = helper(); 
    ... 
} 

int helper() { 
    ... 
} 

答えて

18

自立機能は、カプセル化を改善する:それはヘッダには宣言を必要としないので、クライアント・コードの再コンパイルなし何らかの理由のためにその署名が変化します。私にとっては、実行可能なときはいつでもこのオプションを好む十分な理由です。 (リンク時に識別子の衝突を防ぐために、匿名の名前空間に入れてください。)

しかし、private方法はthisポインタを経由して、クラスのインスタンスへのアクセスとそのプライベート部分があります。そのようなアクセスが必要な場合は、メソッドまたはfriendのいずれかでなければなりません。どちらの場合も、クラス定義(ヘッダーファイル)に表示され、メソッドは単に友人よりも便利です。

+1

2つ目の段落を拡張する:[非友人以外の非メンバー機能](http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197)。関数にプライベートアクセスが必要ない場合は、プライベートアクセスを与えないでください。 –

+0

@sftrabbit:ありがとう。私は第2段落を少し鋭くしました。 –

1

私の立場は、希望のデザインとレイアウトのプロパティを達成している間に、ヘッダーに可能な限り小さな広告が含まれているということです。オプションがある場合は、ソースに移動します。しかし、内部の詳細によっては、クラスの内部の詳細が多すぎるため、実装に反映させることができない場合があります。

4

あなたのヘルパー関数は、オブジェクトの方法であることが理にかなっている場合は、私はほとんど常に暗黙のthisポインターがあるので、それメンバ関数にするのではなく、ヘルパー関数にFoo *を渡すことを好むだろう。

ヘルパー関数がオブジェクトのメソッドである必要がない(つまり、データメンバーや他のメンバー関数にアクセスする必要がない)場合は、スタンドアロン関数にしてください(staticまたは匿名で名前空間、好ましくは)。

2

これはちょっと主観的だと思います。

私の見解では、クラスのメンバーと何か関係があるかどうか、またはフレンドクラスがそれを使用するかどうか(またはprotectedアクセスの場合は派生クラス)が必要かどうかによって異なります。

関数が実際にどのメンバーに対しても動作しておらず、他のメンバーが関心を持っていない場合、静的関数として実装ファイルに保持する必要があります。さらに、それが速くなければならない操作であれば、その機会にそれを作ることができますinline

逆に、関数がクラスで動作しているか、派生クラスまたは関連クラスで余分な使用がある場合は、それをメンバーにします。

関連する問題