Ĺadny brzuch
Mam następujący problem (hipotetyczny): mam jakąś klasę, przechowującą wskaźnik do obiektu jakiejś klasy podstawowej, którą dziedziczą jakieś tam inne klasy. Nie wiem, co jest pod wskaźnikiem. I chcę teraz napisać konstruktor kopiujący...
Zdaje mi się, że należałoby tutaj zastosować RTTI, ale nie wiem jak....
Niekoniecznie RTTI. Klasa może mieć wirtualny konstruktor (ta klasa, która jest bazowa i wskaźnik jest tego typu). I dla każdej klasy pochodnej piszesz konstruktor kopiujący. Myślę, że da się to tak zrobić, aczkolwiek nie mam teraz czasu sprawdzić i rzucić gotowym kodem.
Wirtualny konstruktor kopiujący to trochę mylna nazwa :). Sztuczka polega na tym, że w klasie bazowej tworzysz sobie funkcję:
virtual CBaseClass* CloneSelf();
W każdej klasie pochodnej implementujesz tą funkcje; na przykład:
CDervivedClass* CDervivedClass::CloneSelf()
{
return new CDervivedClass(*this);
}
Teraz wywołując tą funkcję przez wskaźnik do obiektu klasy podstawowej (pod którym siedzi obiekt nieznanego nam typu) dostajesz sklonowany nieznany obiekt, tylko... dalej nie wiesz jakiego typu jest ten obiekt :)
Żeby się tego dowiedzieć to trzeba zaimplementować samodzielnie jakieś proste RTTI albo użyć tego wbudowanego w C++.
Pozdrawiam,
TeMPOraL.
//EDIT
Funkcję CloneSelf z klasy bazowej zapisałem jako CDervivedClass* CDervivedClass::CloneSelf(), choć formalnie powinna ona zwracać CBaseClass*. Z tego co wiem / pamiętam z lektury Meyers'a (More Effective C++), Standard C++ dopuszcza taką zmianę typu w klasach pochodnych, jeśli zmieniamy ze wskaźnika / referencji bardziej ogólnej na bardziej szczególną :). Ale w razie problemów można spokojnie cały czas pisać CBaseClass* :)
Użytkownik TeMPOraL edytował ten post 30 wrzesień 2006, 00:24
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Zdaje mi się, że należałoby tutaj zastosować RTTI, ale nie wiem jak....
Niekoniecznie RTTI. Klasa może mieć wirtualny konstruktor (ta klasa, która jest bazowa i wskaźnik jest tego typu). I dla każdej klasy pochodnej piszesz konstruktor kopiujący. Myślę, że da się to tak zrobić, aczkolwiek nie mam teraz czasu sprawdzić i rzucić gotowym kodem.
Wirtualny konstruktor kopiujący to trochę mylna nazwa :). Sztuczka polega na tym, że w klasie bazowej tworzysz sobie funkcję:
virtual CBaseClass* CloneSelf();
W każdej klasie pochodnej implementujesz tą funkcje; na przykład:
CDervivedClass* CDervivedClass::CloneSelf()
{
return new CDervivedClass(*this);
}
Teraz wywołując tą funkcję przez wskaźnik do obiektu klasy podstawowej (pod którym siedzi obiekt nieznanego nam typu) dostajesz sklonowany nieznany obiekt, tylko... dalej nie wiesz jakiego typu jest ten obiekt :)
Żeby się tego dowiedzieć to trzeba zaimplementować samodzielnie jakieś proste RTTI albo użyć tego wbudowanego w C++.
Pozdrawiam,
TeMPOraL.
//EDIT
Funkcję CloneSelf z klasy bazowej zapisałem jako CDervivedClass* CDervivedClass::CloneSelf(), choć formalnie powinna ona zwracać CBaseClass*. Z tego co wiem / pamiętam z lektury Meyers'a (More Effective C++), Standard C++ dopuszcza taką zmianę typu w klasach pochodnych, jeśli zmieniamy ze wskaźnika / referencji bardziej ogólnej na bardziej szczególną :). Ale w razie problemów można spokojnie cały czas pisać CBaseClass* :)
Użytkownik TeMPOraL edytował ten post 30 wrzesień 2006, 00:24