operacje na kontenerze vector, kontener klasy pochodnej która dziedziczy z bazowej
Ostatnio zmodyfikowano 2015-05-13 18:47
demoo Temat założony przez niniejszego użytkownika |
operacje na kontenerze vector, kontener klasy pochodnej która dziedziczy z bazowej » 2015-05-13 12:45:28 Witam :) W jaki sposób utworzyć kontener klasy pochodnej która dziedziczy z klasy bazowej? Klasa pochodna ma konstruktor który ustawia jedną wartość. Niestety nie mogę po prosty zrobić tak: vector < Pochodna *> vec( 10 ); Bo to utworzy mi kontener o pojemności "10"; Próbowałem jeszcze tak ale wyskakują błędy: vector < Baza *> bloczek; bloczek.push_back( new Pochodna( 10 ) ); Błędy: Undefined symbols for architecture x86_64: "typeinfo for Baza", referenced from: typeinfo for Pochodna in main.o "vtable for Baza", referenced from: Baza::Baza() in main.o NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) Jak na to zaradzić? Proszę o pomoc. Pozdr. |
|
Monika90 |
» 2015-05-13 13:13:41 vector < Baza *> bloczek; bloczek.push_back( new Pochodna( 10 ) );
|
Pomijając ewentualny wyciek pamięci, to ten kod jest poprawny, więc upewnij się że masz definicje wszystkich funkcji wirtualnych, i że plik z tymi definicjami jest częścią projektu. I używaj unique_ptr i make_unique żeby uniknąć wycieków pamięci, a wirtualnego destruktora żeby nie było UB. |
|
demoo Temat założony przez niniejszego użytkownika |
» 2015-05-13 13:28:37 Wszystkie klasy są w pliku main. W klasie Baza jest jedynie nagłówek publicznej funkcji: virtual vector < Sygnal > Przetworz( vector < Sygnal > & signal ) W klasie Pochodna jest funkcja o tym samym nagłówku z tym że tym razem nie jest ona pusta. Ale w tym co chcę zrobić nie używam (jeszcze) funkcji Przetworz więc nie wiem skąd te błędy. O tym że destruktor musi być wirtualny to wiem, a co do tych wskaźników z biblioteki memory, to jeszcze tego nie poznałem, będę musiał doczytać. |
|
Monika90 |
» 2015-05-13 13:42:13 Funkcja wirtualna musi mieć definicję nawet jeżeli nie jest używana, no chyba że to jest czysta funkcja wirtualna (pure virtual), to wtedy nie musi. Gdy w klasie bazowej zadeklarujesz funkcję jako pure virtual: virtual vector < Sygnal > Przetworz( vector < Sygnal > & signal ) = 0;
to definicja nie będzie potrzebna. Klasa Baza będzie wtedy klasą abstrakcyjną. |
|
demoo Temat założony przez niniejszego użytkownika |
» 2015-05-13 13:49:25 Dzięki wielkie! Nie spodziewałem się że to będzie coś tak banalnego. Bardzo chętnie poczytałbym o tych wyciekach pamięci i wskaźnikach inteligentnych z biblioteki memory. Polecasz jakieś artykuły, bo ten z msdn pisany jest w taki sposób że nic nie rozumiem. |
|
Fireho |
» 2015-05-13 18:12:43 Wycieki pamięci - chodzi o to że jak allokujesz pamięć przez new , to nie jest ona automatycznie zwalniana. Musisz wtedy sam ją zwolnić przez delete . Jak tego nie zrobisz, to ta pamięć będzie wciąż zajmowała miejsce i to jest wyciek pamięci. Sprytne wskaźniki - jest to klasa udająca wskaźnik, której destruktor automatycznie wywołuje delete . |
|
Monika90 |
» 2015-05-13 18:47:38 push_back może rzucić wyjątkiem, w takiej sytuacji taki kod vector < Baza *> bloczek; bloczek.push_back( new Pochodna( 10 ) );
nie daje szans na wywołanie delete. Co innego tu vector < unique_ptr < Baza >> bloczek; bloczek.push_back( make_unique < Pochodna >( 10 ) );
tutaj delete będzie wywołane automatycznie. |
|
« 1 » |