[c ++] [vector] [destructor] czy erase oraz clear uruchomiają destruktory ??
Ostatnio zmodyfikowano 2017-10-06 09:51
aaadam Temat założony przez niniejszego użytkownika |
[c ++] [vector] [destructor] czy erase oraz clear uruchomiają destruktory ?? » 2017-10-06 09:01:25 mam dziedziczenie i zastanawiam się czemu destruktory się nie odpalają. class abstractCar { public: abstractCar() { cout << "create abstract" << endl; } virtual void fun() { cout << "fun abs" << endl; }; virtual ~abstractCar() { cout << "erase abstract" << endl; } };
class f1Car : public abstractCar { public: f1Car() { cout << "f1car Ctor" << endl; } void fun() { cout << "fun f1" << endl; } ~f1Car() { cout << "erase f1" << endl; } }; class f2Car : public abstractCar { public: f2Car() { cout << "f2car Ctor" << endl; } void fun() { cout << "fun f2" << endl; } ~f2Car() { cout << "erase f2" << endl; } }; int main() { vector < abstractCar *> vCar; vCar.push_back( new f1Car() ); cout << endl; vCar.push_back( new f2Car() ); for( int i = 0; i < vCar.size(); i++ ) { vCar[ i ]->fun(); } vCar.erase( vCar.begin() ); vCar.clear();
|
|
Monika90 |
» 2017-10-06 09:06:41 czy erase oraz clear uruchomiają destruktory ??
|
Oczywiście, że tak. mam dziedziczenie i zastanawiam się czemu destruktory się nie odpalają.
|
Typy wbudowane (u Ciebie wskaźniki) nie mają destruktorów. |
|
aaadam Temat założony przez niniejszego użytkownika |
» 2017-10-06 09:14:28 oki dzięki rozumiem :) jeszcze jedno pytanie mam : przerobiłem main tak : vector < abstractCar > vCar; vCar.push_back( f1Car() );
for( int i = 0; i < vCar.size(); i++ ) { vCar[ i ].fun(); } vCar.erase( vCar.begin() );
a takie wyjscie programu :
create abstract f1car Ctor erase f1 erase abstract fun abs erase abstract
dlaczego 3 i 4 linijka sie pokazuje? a podczas cleara tylko pokazuje erase abstract? wlasciwie nie ma teraz polimorfizmu bo fun abs drukuje ... |
|
Monika90 |
» 2017-10-06 09:35:57 Teraz w wektorze masz obiekty klasy abstractCar (co zresztą oznacza że nie jest to klasa abstrakcyjna). vCar.push_back( f1Car() ); powoduje wstawienie do wektora tylko kawałka obiektu. Jeżeli chcesz mieć polimorfizm i automatyczną destrukcję to powinieneś użyć unique_ptr int main() { vector < unique_ptr < abstractCar >> vCar; vCar.push_back( make_unique < f1Car >() ); cout << endl; vCar.push_back( make_unique < f2Car >() ); for( int i = 0; i < vCar.size(); i++ ) { vCar[ i ]->fun(); } vCar.erase( vCar.begin() ); vCar.clear(); }
|
|
aaadam Temat założony przez niniejszego użytkownika |
» 2017-10-06 09:51:19 tak myślałem, że trzeba smartpointerów użyć, dziękuję za pomoc :) |
|
« 1 » |