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

[c ++] [vector] [destructor] czy erase oraz clear uruchomiają destruktory ??

Ostatnio zmodyfikowano 2017-10-06 09:51
Autor Wiadomość
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ą.
C/C++
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();
P-165470
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.
P-165471
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 :
C/C++
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 ...
P-165472
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
C/C++
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();
}
P-165473
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 :)
P-165474
« 1 »
  Strona 1 z 1