Polimorficzny konstruktor kopiujący
Ostatnio zmodyfikowano 2019-12-22 00:02
Tojmak Temat założony przez niniejszego użytkownika |
Polimorficzny konstruktor kopiujący » 2019-12-19 21:18:27 Witam, napotkałem pewien problem, z którym nie potrafię sobie poradzić. Mianowicie utworzyłem klasę abstrakcyjną, na podstawie której powstały odpowiednie obiekty. następnie próbuję utworzyć obiekt, który skopiuje sobie atrybuty z jednego z wcześniej utworzonych obiektów. Problem stanowi fakt, że podczas próby skorzystania z domyślnego konstruktora kopiującego do przekazania atrybutów, przekazany zostaje również adres wcześniejszego obiektu. Nie jestem pewny czy dobrze analizuje utworzony przeze mnie kod, poniżej zamieszczam fragment. vector < Weapon *> atkItems;
for( list < Chests >::iterator itr = Chest.begin(); itr != Chest.end(); itr++ ) { int random = rand() % atkNumItems; Items * temp = atkItems[ random ]; itr->setItems( temp ); }
Dodam, że klasa Weapon jest klasą pochodną, dziedziczącą publicznie po klasie Items, klasa Weapon również jest klasą abstrakcyjną, po której dziedziczą dwie kolejne klasy. Mam nadzieję, że tyle wystarczy do wytknięcia mi jakiegoś babola. Pewnie jakaś podstawa, ale od dłuższego czasu błądzę bez efektów. Będę wdzięczny za pomoc. Pozdrawiam |
|
pekfos |
» 2019-12-19 21:40:30 Podałeś zły kod. Z pewnością chodziło o implementację setItems. W podanym kodzie nie ma miejsca nic z tego, co opisałeś. |
|
Tojmak Temat założony przez niniejszego użytkownika |
» 2019-12-19 21:46:30 Klasa setItems zawiera jedynie to: void setItems( Items * item ) { items.push_back( item ); };
Wydawało mi się, że kwestia konstruktora kopiującego zachodzi w linii: Items * temp = atkItems[ random ];
Po zdebuggowaniu kodu to właśnie w tej linii dochodzi do napotkanego błędu. |
|
pekfos |
» 2019-12-19 21:48:37 To kopiowanie wskaźnika, nie obiektu. |
|
Tojmak Temat założony przez niniejszego użytkownika |
» 2019-12-19 21:58:24 Okej... faktycznie, nie wiem czemu potraktowałem wskaźnik jako składową typu klasy. Czy można w jakiś łatwy sposób skopiować obiekt pochodny? Wskaźnik być chyba musi by móc korzystać z polimorfizmu prawda? |
|
pekfos |
» 2019-12-19 22:20:19 Możesz dodać metodę wirtualną do kopiowania obiektu i zaimplementować ją dla każdej nieabstrakcyjnej klasy pochodnej. |
|
Tojmak Temat założony przez niniejszego użytkownika |
» 2019-12-21 12:42:18 Czy mógł bym prosić o jakiś krótki przykład implementacji? Czuję, że trochę błądzę. |
|
pekfos |
» 2019-12-22 00:02:49 W klasie bazowej B dodaj metodę virtual B* kopia() const. Gdy ta metoda jest wywołana w klasie pochodnej T, to wiesz że typ dynamiczny obiektu to jest właśnie T, więc wiesz jak obiekt skopiować. Wtedy wywołanie konstruktora to |
|
« 1 » |