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

operacje na kontenerze vector, kontener klasy pochodnej która dziedziczy z bazowej

Ostatnio zmodyfikowano 2015-05-13 18:47
Autor Wiadomość
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:

C/C++
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.
P-132181
Monika90
» 2015-05-13 13:13:41
C/C++
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.
P-132183
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ć.
P-132184
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:
C/C++
virtual vector < Sygnal > Przetworz( vector < Sygnal > & signal ) = 0;
to definicja nie będzie potrzebna. Klasa Baza będzie wtedy klasą abstrakcyjną.
P-132185
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.
P-132186
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
.
P-132202
Monika90
» 2015-05-13 18:47:38
push_back może rzucić wyjątkiem, w takiej sytuacji taki kod
C/C++
vector < Baza *> bloczek;
bloczek.push_back( new Pochodna( 10 ) );
nie daje szans na wywołanie delete.

Co innego tu
C/C++
vector < unique_ptr < Baza >> bloczek;
bloczek.push_back( make_unique < Pochodna >( 10 ) );
tutaj delete będzie wywołane automatycznie.
P-132204
« 1 »
  Strona 1 z 1