Czy często używacie klas zagnieżdżonych ? Jakoś nie wyobrażam żebym tego używał.
To się przydaje raczej dość rzadko, ja używam np. wtedy gdy potrzebuję klasy opisującej argumenty albo wyniki jakiejś metody prywatnej.
Na dłuższą metę nie powinny występować w kodzie praktycznie w ogóle - nikt nie lubi tłustych klas, przez które trzeba długo scrollować :-P
Ale do szybkich snippetów czy proof-of-concept
się przydają.
Typowym przykładem klasy zagnieżdżonej w C++ są iteratory kontenerów z biblioteki standardowej. Jaka z tego korzyść? Np taka, że gdyby je tworzyć na zewnątrz każdy musiałby się nazywać inaczej a tak nie musi, bo jest w przestrzeni nazw klasy kontenera (mówię tu o samej nazwie klasy iteratora). Poza tym jego istnienie na zewnątrz ma średni sens, tzn. iterator nie ma sensu jako osobny byt bo jest nierozerwalnie związany z kontenerem po którym iteruje.
To właśnie jest główne zastosowanie. Klasa zagnieżdżona nie powinna mieć sensu jako osobny twór, tzn. mogący istnieć bez i obok jej klasy nadrzędnej. Klasa nadrzędna wprowadza też kontekst dla nazwy klasy zagnieżdżonej przez co jej nazwa może być krótsza i być tak sama jak wewenątrz innych klas (np. jak w przypadku iteratorów). Jest to więc głównie kwestia organizacji i czytelności kodu.
co prawda nie w c++, ale tak.
dosyc czesto podczas implementacji klasy pakuje powiazane skladowe/metody w klase wewnetrzna o dosyc ogolnej nazwie, zwykle w pewnym momencie zostaje ona wyciagnieta na zewnatrz (gdy jest zbyt duza i/lub na tyle generyczna ze moze byc wykorzystana gdzie indziej).
innym przykładem mogą być struktury pomocnicze pisane na użytek algorytmów, czy zwiększenia czytelności kodu
void f(T arg, T1 arg1, T2 arg2, T3 arg3, T4 arg4, itd...);
vs
struct Ts
{
T arg;
T1 arg1;
itd...
};
void f(Ts args);
class list {
private:
class node {
...
};
};
No i wspomniane już iteratory. Oprócz tego nie używałem takiej konstrukcji za wiele.