質問

私の質問は、あなたの練習で、どのくらいの頻度でネストされたクラスを使用し、どの場合にどのくらいの頻度で使用していますか?ネストされたクラスの本当の力は何ですか、それらなしでは何ができませんか? PSそれは何なのか説明しないでください、私はそれを知っています(私はそれを知っていますfrom technical point of view)

役に立ちましたか?

解決

私は通常、ネストされたクラスを使用して埋め込みます Findersオブジェクト (で使用する std::find_if)私の特定のタイプに。

何かのようなもの:

// Dummy example
class Foo
{
  public:
    class finder
    {
      public:

        finder(int value) : m_value(value) {};

        bool operator()(const Foo& foo) { return (foo.m_int_value == value); }

      private:

        int m_value;
    };

   private:

     int m_int_value;

     friend class finder;
};

それで:

vector<Foo> foo_list;
vector<Foo>::iterator foo = 
  std::find_if(foo_list.begin(), foo_list.end(), Foo::finder(4));

もちろん、これはネストされたクラスを使用せずに行うことができます。しかし、ファインダーはクラスの定義以外では使用していないため、非常にエレガントだと思います。

コードを再構築する場合にクラスを削除する場合、ファインダーも削除する必要があります。

他のヒント

私は次の理由でそれらをめったに使用しません:

  • それらは、私がヘッダーファイルに持ちたくない実装の詳細である傾向があります。
  • 私は構文が好きではありません。

埋め込まれた構造体を使用することがあります(ポッドの場合、方法なし)。

クラスにグループ化/カプセル化されたデータを含める必要がある場合に役立ちます。あなたはそれをすべてに考案することができます private 外の世界によるデータ型の意図的でない使用を防ぐためのネストされたクラス。

また、友情を達成するためのより明確な方法としても使用できます。友情を使う代わりにクラスをネストすることにより、あなたはさらにカプセル化します friend コードパーツ間の関係。

特にPIMPLを使用する場合、クラスにアクセスする必要があるユーティリティクラスとして使用しています。これにより、実装はすでにCPPファイルにあります。
ネストされたクラスなしではできないC ++には何もありませんが、ほとんどが私のクラスにイベントを派遣するだけで、これらのクラスをスコープに制限する良い方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top