krissuu Temat założony przez niniejszego użytkownika |
Konwersja między obiektami klas » 2013-04-08 22:23:49 Witam. Mam pytanie czy możliwa jest konwersja między obiektami klas (poprzez operator przypisania) tzn. obiekt klasy bazowej przypisujemy do obiektu klasy pochodnej i odwrotnie. Jeśli tak to jak to zrobić? Moja klasa: class czlowiek { public: int wiek, * wsk; char plec, imie, nazwisko; static int licznik; czlowiek() { licznik++; } ~czlowiek() { licznik--; } czlowiek operator =( const czlowiek & ) { return * this; } };
class student : public czlowiek { public: int nr_indeksu, semestr; char kierunek, wydzial; };
class prowadzacy : public czlowiek { public: char tytul; int ilosc_publikacji; };
int czlowiek::licznik = 0;
Na razie zadeklarowałem operator przypisania ale zbytnio nie mam pomysłu co dalej... |
|
Monika90 |
» 2013-04-08 22:45:16 A po co chcesz to robić? Operator przypisania dla obiektów klas należących do hierarchii to pakowanie się w kłopoty.
Klasy mają albo semantykę wartości: mają operator przypisania, konstruktor kopiujący i nie należą do hierarchi, albo mają semantykę referencji: brak operatora przypisania, brak konstruktora kopiującego, należą do hierarchii, mają f. wirtualne i używa się ich przez wskaźniki lub referencje.
Mieszanie tych dwóch rodzajów klas to zadanie dla zaawansowanych.
|
|
krissuu Temat założony przez niniejszego użytkownika |
» 2013-04-08 22:55:34 |
|
Monika90 |
» 2013-04-08 23:33:42 Jak chcesz sprawdzić, to sprawdź: struct Base { };
struct Derived : Base { };
int main() { Base b; Derived d; b = d; static_cast < Base &>( d ) = b; }
|
|
krissuu Temat założony przez niniejszego użytkownika |
» 2013-04-08 23:56:04 Ok. Mam coś takiego: czlowiek obiekt3; student obiekt4; obiekt3 = obiekt4;
W drugą stronę się nie da, co jest w sumie logiczne, bo klasa student dziedziczy po klasie człowiek. Chciałbym jeszcze się dowiedzieć czym skutkuje taka konwersja i wydaje mi się, że temat będzie wyczerpany i do zamknięcia:) |
|
Monika90 |
» 2013-04-09 11:26:55 W drugą stronę się nie da |
Da się w obie strony, tylko Ty nie wiesz jak. I w obie strony kopiowana jest tylko częśc bazowa obiektu, co jest na ogół niepożądane. Dlatego klasa bazowa powinna być abstrakcyjna, albo kopiowanie powinno być wyłączone w całej hierarchii. |
|
Hipochondryk |
» 2013-04-11 20:25:16 ja bym po prostu przeładował operator = na swoje potrzeby na zewnątrz klas - i po problemie. |
|
Hipochondryk |
» 2013-04-11 20:30:12 przepraszam za dubel. masz 3 klasy więc przeładuj operator = kilka razy dla róznych argumentów, nie korzystaj z domyślnie wygenerowanego przeladowania ponieważ masz wskaźniki, a chyba nie chcemy by jeśli mam dom i Ty zapragniesz mieć identyczny dom tylko z paroma różnicami(dziedziczenie) to burzysz mój i stawiasz w tym samym miejscu - to wlasnie robi domyślnie wygenerowany operator = przez kompilator - tylko kupujesz działkę, i tam stawiasz swój dom. - czyli kopioujesz zawartość wskaźnika a do wskaźnika b, a nie każesz obiektowi B korzystać ze wskaźnika A ponieważ jeśli na wskaźniku dokonasz operacjii to na każdym innym obiekcie to się stanie z automatu. |
|
« 1 » |