14

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() {
    ...   
}
4

4 に答える 4

24

実装ファイルの独立した関数はカプセル化を改善します。ヘッダーで宣言する必要がないため、何らかの理由で署名が変更されたときにクライアントコードを再コンパイルする必要がありません。私にとって、それは実行可能なときはいつでもこのオプションを好む十分な理由です。(リンク時に識別子が衝突しないように、必ず匿名の名前空間に配置してください。)

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

于 2012-10-04T23:00:45.073 に答える
4

ヘルパー関数がオブジェクトのメソッドであることが理にかなっている場合は、ほとんどの場合、ヘルパー関数にthisaを渡すのではなく、暗黙のポインターが存在するように、それをメンバー関数にすることをおFoo *勧めします。

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

于 2012-10-04T23:01:01.243 に答える
2

これは少し主観的だと思います。

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

関数が実際にどのメンバーでも動作せず、他の誰もそれに興味がない場合は、静的関数として実装ファイルに保持する必要があります。さらに、それが高速でなければならない操作である場合、あなたはそれを作るためにその機会を利用することができますinline

逆に、関数がクラスで動作する場合、または派生クラスまたは関連クラスで追加の用途がある場合は、その関数をメンバーにします。

于 2012-10-04T23:02:03.627 に答える
1

私の立場は、目的のデザインとレイアウトのプロパティを実現しながら、ヘッダーに含まれる広告をできるだけ少なくすることです。オプションがある場合、それはソースに入ります。ただし、一部の内部詳細は、実装に参加できるようにするために、クラスの非常に多くの内部詳細にアクセスする必要があります。

于 2012-10-04T23:00:52.743 に答える