私の質問は、実際にネストされたクラスを実際に使用する頻度と、どのような場合ですか? 入れ子になったクラスの本当の力は何ですか?それらなしでは何ができないのでしょうか? PS どうか説明しないでください。私は知っています ( from technical point of view
)
4 に答える
私は通常、ネストされたクラスを使用して、ファインダ オブジェクト( で使用する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));
もちろん、これはネストされたクラスを使用せずに行うことができます。しかし、ファインダーはクラス定義以外では使用されないため、非常にエレガントだと思います。
コードリファクタリングの場合にクラスを削除した場合は、ファインダーも削除する必要があります。
以下の理由から、めったに使用しません。
- それらは、ヘッダー ファイルに含めたくない実装の詳細である傾向があります。
- 私は構文が好きではありません。
埋め込み構造体を使用することがあります (POD の場合、メソッドはありません)。
私はそれらを自分のクラスにアクセスする必要のあるユーティリティクラスとして使用します:シグナルハンドラー、タイマー、特にpimplを使用する場合、実装はすでにcppファイルにあります。
C ++には、ネストされたクラスなしでは実行できないものはありませんが、ほとんどの場合、イベントをクラスにディスパッチするだけのこれらのクラスをスコープ制限するための優れた方法です。
クラスにグループ化/カプセル化されたデータを含める必要がある場合に役立ちます。private
入れ子になったクラスにすべてを工夫して、外の世界によるデータ型の意図しない使用を防ぐことができます。
また、友情を達成するためのより明確な方法として使用することもできます. フレンドシップを使用する代わりにクラスをネストすることによりfriend
、コード部分間の関係をさらにカプセル化します。