質問
私の質問は、あなたの練習で、どのくらいの頻度でネストされたクラスを使用し、どの場合にどのくらいの頻度で使用していますか?ネストされたクラスの本当の力は何ですか、それらなしでは何ができませんか? 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 ++には何もありませんが、ほとんどが私のクラスにイベントを派遣するだけで、これらのクラスをスコープに制限する良い方法です。