1

私の質問は純粋に組織的な性質のものであり、したがって、潜在的な答えは本質的に主観的なものである可能性があることを認識しています。何年にもわたってC#で作業した後、私はついにC ++に戻り、ファイルを適切に整理する方法に慣れるのに苦労しています。

基本的に、述語と関数オブジェクトを定義するのに最適な場所を知りたいです。現在、単一のクラスでSTLアルゴリズムに単純な関数オブジェクトを使用しています。この関数オブジェクトは他のクラスには役に立たないので、どこに置くのですか?同じ名前空間とヘッダーファイルまたは.cppファイルに配置しますか?匿名の名前空間に配置しますか、それとも独自のヘッダー/ cppファイルに配置しますか?

ありとあらゆる回答をよろしくお願いします。

ケビン

4

4 に答える 4

1

述語の用途によって異なります。他の場所では役に立たないと言うので、人々がヘッダーファイルをインクルードするときに名前空間が乱雑にならないように、cppファイルで宣言するのが最善です。

ファイルスコープでも役に立たない場合は、それほど複雑でなければラムダの使用を検討できます。C ++ 11のラムダ(またはBoost.Lambda)にアクセスできない場合は、関数スコープでもローカルファンクターを宣言できます。これはかなり便利です!ただし、ファイルスコープレベルでテンプレート化されたファンクタを使用することはできません。これは、多くの場合、必要なものです(ここでの例は、「テンプレート化されたイテレータ」の使用です)。

于 2013-03-06T20:21:55.063 に答える
1

1つのクラスだけで使用することを意図していて、他の人に役立つとは思わない場合は、ネストされたクラスの時間のように聞こえます。

class SomeClass {
public:
    //...

    struct MyPredicate {
        bool operator() (const SomeData&) const;
    };

};

上記のクラスの実際の名前はです。したがって、宣言でが定義されていないSomeClass::MyPredicate場合は、どこかoperator()で定義する必要があります。SomeClass::MyPredicate::operator()ただし、メンバーの内部では、SomeClassと入力するだけですMyPredicate

述語をそれを含むクラスのメンバーにすることもできますprivate。その場合、外部コードでそのクラスの名前を入力することさえできません。

于 2013-03-06T20:22:04.200 に答える
1

述語が何であるかによって異なります。エンドユーザーが使用できる場合は、その宣言をヘッダーに配置します。理想的には、const refを使用する無料の関数として、ソースファイルに実装します。

それが(ライブラリではなく)プログラムの一部である場合は、単純化のために同じことを行います。

厳密に内部使用のためであり、エンドユーザーに使用させたくない場合は、ソースファイルの匿名名前空間に配置できます。

于 2013-03-06T20:06:58.640 に答える
1

C ++ 11は使用できないと思います。そうでない場合は、可能な限りラムダを使用することをお勧めします;)ただし、ここでは適切な引数がないため、通常は次のようにします。

述語を単一の関数でのみ使用する場合は、関数で宣言します。述語を1つのコードファイルでのみ使用する場合は、anonymouse名前空間に配置します。再構築とファイルの依存関係の量を減らすために、.hファイルをできるだけクリーンに保つのが好きです。

私はanonymouse名前空間を使用するか、それらを関数に入れると、名前の衝突を回避し、コードをよりクリーンにするのに役立つと信じています。

于 2013-03-06T20:14:48.793 に答える