Kontener na obiekt pochodne
Ostatnio zmodyfikowano 2016-03-31 21:01
emSon Temat założony przez niniejszego użytkownika |
Kontener na obiekt pochodne » 2016-03-30 20:41:58 Cześć. Załóżmy że mam taki zestaw klas: class Baza { public: virtual void Metoda() = 0; };
class PochodnaJeden : public Baza { public: virtual void Metoda(); };
class PochodnaDwa : public Baza { public: virtual void Metoda(); void DodatkowaMetoda(); };
Czy istnieje możliwość umieszczenia obiektów klasy PochodnaJeden i PochodnaDwa w tym samym kontenerze? I jeszcze jedno pytanko. Jeśli Baza ma ustawiony konstruktor, to czy muszę go wywoływać w klasie pochodnej? PochodnaJeden::PochodnaJeden() : Baza() { }
|
|
michal11 |
» 2016-03-30 20:46:03 Jeżeli jest to konstruktor domyślny to nie musisz. Najlepiej zrobić tak: std::vector < std::unique_ptr < Baza >> vec; oczywiście zakładając, że chcesz skorzystać z vectora. Możesz też zrobić tak: std::vector < Baza *> vec; Tylko musisz pamiętać o poprawnym zwolnieniu wszystkich obiektów żeby nie mieć wycieku pamięci. |
|
emSon Temat założony przez niniejszego użytkownika |
» 2016-03-30 20:54:49 No ok, ale przy użyciu : m_obiekty[ 0 ]->DodatkowaMetoda();
wyświetla się error: ‘class 'Bazowa’ has no member named ‘DodatkowaMetoda’
|
|
michal11 |
» 2016-03-30 22:35:07 Nic dziwnego skoro nie ma takiej metody w klasie Baza, jeżeli musisz tak zrobić to znaczy, że masz źle zaprojektowaną hierarchię klas ew. źle zaprojektowane wykorzystanie kontenera. |
|
emSon Temat założony przez niniejszego użytkownika |
» 2016-03-31 21:01:51 Więc tak, w klasie którą tu nazywam PochodnaDwa miałem po prostu dodatkową flagę i Getter oraz Setter do niej. I już wiem, że da się tak zrobić: if( PochodnaDwa * ptr = dynamic_cast < PochodnaDwa *>( table[ i ] ) ) { ptr->DodatkowaMetoda(); }
|
|
« 1 » |