Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Polimorficzny konstruktor kopiujący

Ostatnio zmodyfikowano 2019-12-22 00:02
Autor Wiadomość
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.

C/C++
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

P-175827
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ś.
P-175828
Tojmak
Temat założony przez niniejszego użytkownika
» 2019-12-19 21:46:30
Klasa setItems zawiera jedynie to:

C/C++
void setItems( Items * item ) {
    items.push_back( item ); };

Wydawało mi się, że kwestia konstruktora kopiującego zachodzi w linii:

C/C++
Items * temp = atkItems[ random ];

Po zdebuggowaniu kodu to właśnie w tej linii dochodzi do napotkanego błędu.
P-175829
pekfos
» 2019-12-19 21:48:37
To kopiowanie wskaźnika, nie obiektu.
P-175830
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?
P-175831
pekfos
» 2019-12-19 22:20:19
Możesz dodać metodę wirtualną do kopiowania obiektu i zaimplementować ją dla każdej nieabstrakcyjnej klasy pochodnej.
P-175832
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ę.
P-175839
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
C/C++
return new T( * this );
P-175844
« 1 »
  Strona 1 z 1