taki problem mi się narodził, dość prymitywny i szczerze mówią nie mam pomysłu jak to rozwiązać tak, żeby nie łamać wszystkich zasad OPP :> :
mam dwie hipotetyczne klasy:
//wewnętrzna posiada konstruktor 2 argumentowy, domyślny niedozwolony
class base { public: base(typ x,typ y); protected: base(); [...] };
//klasa zewnętrza zawiera klasę base
class outside { public: outside(takie tam); protected: base obiekt_wew; [...] };
i teraz jest taka akcja:
-klasa outside przy tworzeniu musi wywołać konstruktor dla obiektu obiekt_wew, należy to zrobić w liście inicjalizacyjnej, to wiadomo, i tu się pojawia ale, otóż przed wywołaniem konstruktora obiekt_wew trzeba obliczyć dla niego parametry, tylko to liczenie nie jest takie proste i wiąże się wywołaniem kilku funkcji i utworzeniem kilku następnych obiektów :>
ogólnie konstruowanie obiektu outside ma składać się:
-obliczenie argumentów dla konstruktora obiektu obiekt_wew (kolejne funkcje i obiekty)
-dopiero teraz wywołanie konstruktora obiekt_wew z tymi parametrami
-dalsze ustawianie utworzonego obiektu obiekt_wew
w javie z tego co wiem, nie ma takich problemów, wywołujesz konstruktor obiektu wewnętrznego gdzie ci pasuje, a w C++ jest lista inicjalizacyjna, która wykonuje się przed działaniem konstruktora (w którym potrzebuję obliczyć parametry dla konstruktora wywoływanego w tej liście)
możliwe niezbyt eleganckie rozwiązania, na które mam koncepcję:
-
obiekt_wew jako wskaźnik,
wtedy wywołanie konstruktora(+alokacja obiektu), może nastąpić gdzieś w środku konstruktora outside, ale tworzenie go na stercie nie jest dobrym wyjściem, lepiej żeby był statycznie wsadzony w klasę outside(już wolę złamać wszelkie zasady OPP :P) -
łamanie wszelkich zasad OPP - sposób bardzo C, anty C++ :>
niewywoływanie składniowo w ogóle konstruktora obiektu_wew(tzn. wtedy konstruktor domyślny którego bym musiał upublicznić), a za to, zrobić copy+paste kod konstruktora obiekt_wew do konstruktora outside, w miejsce gdzie powinien być (gdzie bym chciał, żeby był) wywoływany konstruktor obiekt_wew i tak zmienić ten wklejony kod (ten niby konstruktor obiekt_wew) żeby memset'ował prywatne składowe obiekt_wew(zainicjował je, tak jak konstruktor powinien) kompletnie olewając hermetyzację (wiem straszne xd), żeby maszynowo to działało tak jakby się w środku konstruktora outside wykonywał konstruktor obiektu obiekt_wew -
unknown name (taki, że ujdzie nie łamiąc za specjalnie zasad OPP, na ten bym się najbardziej zdecydował z tych trzech)
otóż robię sobie metodę prywatną klasy outside, którą wywołam jako parametr konstruktora w liście inicjalizacyjnej
class outside { [...] protected: obliczParametry(arg z konstruktora outside) };
[...]
//i teraz konstruktora outside by wyglądał tak:
outside::outside(...args...): obiekt_wew(obliczParametry(...args...))
{
//ustawianie
}
obliczParametry, pewnie by zwracało jakąś strukturkę odpowiadającą parametrom, co by się wiązało ze zrobieniem kolejnej wersji konstruktora obiekt_wew z parametrem takiej strukturki(ale to nie problem), w obliczParametry bym obliczał potrzebne parametry dla konstruktora obiekt_wew, obiekt by się tworzył w liście, dalej bym sobie go ustawiał odpowiednio, niby wszystko pięknie, ale jest jedno ale: w obliczParametry musiałbym tworzyć 2 obiekty, które są potrzebne do obliczeń i do ustawiania obiektu, mógłbym je tworzyć w obliczParametry, a usuwać w konstruktorze outside, albo oddzielnie tworzyć te same obiekty dla zasięgu obliczParametry i konstruktora outside, tylko po co 2x to samo, a opcja z tworzeniem obiektu wymusza przekazania z obliczParametry do konstruktora outside pointery do utworzonych obiektów, albo je globalnie(globalnie odpada bo chcę zrobić wszystko w headerach jako inline), albo jako składowe klasy, tak żeby były widoczne tu i tu, tylko znowu trzeba robić składowe, które będą przez całe, życie obiektu outside, a są potrzebne tylko podczas tworzenia obiektu
najlepiej jakbym się dowiedział, że można jakoś w cpp określać moment wywołania konstruktora obiektu wewnętrznego o czym nie wiem, jeśli się nie da, trzeba będzie wybrać jakiś kompromis