• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wektor wskaźników a dziedziczenie

Cloud VPS
0 głosów
730 wizyt
pytanie zadane 1 października 2016 w C i C++ przez niezalogowany

Witam, mam taki wektor:

    vector<Human*> v_selHumans;

Z klasy Human dziedziczy klasa Engineer. W wektorze v_selHumans w pewnym przypadku jest tylko jeden obiekt klasy Engineer. Obiekty klasy Engineer mają jeszcze jedną metodę:

void Engineer::startGoingToConstrucionSite();

i w pewnym momencie, gdzie jest tylko jeden obiekt klasy Engineer, chcę wywołać tę funkcję za pomocą wektora wskaźników:

(*(selectionControl->getHumansVector()->begin()))->startGoingToConstrucionSite();
(selectionControl->getHumansVector() - ta część zwraca owy wektor wskaźników.

i jest mały problem:

|179|error: 'class Human' has no member named 'startGoingToConstrucionSite'|

Czy jest możliwość za pomocą tego wektora wywoływać obiekty klas pochodnych?

1
komentarz 1 października 2016 przez adrian17 Mentor (354,120 p.)

Przy okazji:

*(vec.begin()) -> vec.front()

 

komentarz 1 października 2016 przez niezalogowany
dlaczego?
komentarz 1 października 2016 przez adrian17 Mentor (354,120 p.)
Bo jest prostsze i czytelniejsze.

2 odpowiedzi

+2 głosów
odpowiedź 1 października 2016 przez criss Mędrzec (172,570 p.)
wybrane 1 października 2016
 
Najlepsza

Musisz zrzutować na wskaźnik klasy pochodnej. Najlepiej dynamic_castem:

if(Engineer * eptr = dynamic_cast<Engineer *>(*vec.begin()))
    eptr->startGoingToConstrucionSite();

Inaczej (bez rzutowania) nie da rady.

dynamic_cast w wypadku wskaźników zwraca nullptr jeśli klasa obiektu w arg. nie dziedziczy z klasy podanej w < >. Stąd ten if.

komentarz 1 października 2016 przez niezalogowany

Chmmm niestety mi wyrzuca taki błąd, o co może chodzić?

error: cannot dynamic_cast 'selectionControl->Control::getHumansVector()->std::vector<_Tp, _Alloc>::begin<Human*, std::allocator<Human*> >().__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator*<Human**, std::vector<Human*> >()' (of type 'class Human*') to type 'class Engineer*' (source type is not polymorphic)|

 

komentarz 1 października 2016 przez criss Mędrzec (172,570 p.)

Na wszelki wypadek pokaż co dokładnie napisałeś.

Ale możliwe, że twoja klasa bazowa (Human) nie ma metod wirtualnych. dynamic_cast tego wymaga (link). Najprościej, tak jak jest napisane w zalinkowanym temacie, jest zrobić wirtualny destruktor w klasie bazowej, który anyway każda klasa bazowa powinna mieć.

+1 głos
odpowiedź 1 października 2016 przez Blacha Mądrala (5,960 p.)
Poszukaj "rzutowanie klasy w dół".

Podobne pytania

0 głosów
1 odpowiedź 193 wizyt
pytanie zadane 25 stycznia 2017 w Matematyka, fizyka, logika przez Ehlert Ekspert (215,050 p.)
0 głosów
1 odpowiedź 994 wizyt
pytanie zadane 7 lutego 2017 w C i C++ przez Piotr Goździewski Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 156 wizyt
pytanie zadane 18 kwietnia 2017 w C i C++ przez Dominik Kulis Użytkownik (720 p.)

93,459 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...