[C++]Classe astratta, distruttore.

di il
8 risposte

[C++]Classe astratta, distruttore.

Salve, ho un dubbio.
Creo una classe astratta con un attributo char* x , e la uso per creare un'altra classe cioè la derivata.
La classe derivata acquista il char* x al quale dò un indirizzo di memoria dell'area heap, nel distruttore della classe derivata devo aggiungere delete[] x? Oppure è demandato al distruttore della classe astratta per distruggerlo?

8 Risposte

  • Re: [C++]Classe astratta, distruttore.

    Di solito la regola è: chi crea poi distrugge. Se quel char* x è allocato nel costruttore della classe base, spetta alla classe base distruggerlo. Se char* è allocato nella classe derivata, spetta alla classe derivata distruggerlo.
    Se non vuoi avere problemi usa una std::string o un std::vector<char> al posto di char* .
  • Re: [C++]Classe astratta, distruttore.

    Okok grazie per la regola .
    Non posso usare nè std::string nè std::vector<char> è richiesta una char* dinamica nell'esercizio.
    Nella classe astratta devo aggiungere il delete[] x lo stesso? Anche se non posso creare oggeti?
  • Re: [C++]Classe astratta, distruttore.

    Se la variabile 'char* x' è sul heap sicuramente devi aggiungere il delete, poi dipende da come la gestisci.
    Se è puntatore ad un char devi usare il 'delete' semplice invece se è un array( c style string ) devi usare 'delete []'.

    Se ho capito bene tu acquisti la memory per il puntatore nella classe derivata, posso dirti che questo non è una buona pratica...aspetta alla classe in cui è contenuto il puntatore ad allocarlo sull'heap, cioè alla classe base.
  • Re: [C++]Classe astratta, distruttore.

    Si avevo messo un attributo nella classe astratta char* nome, e avevo solo dato il valore NULL nel costruttore; poi nella classe derivata l'ho allocata dinamicamente nome=new char[strlen()]. Il distruttore delete[] nome devo aggiungerlo nella classe derivata in questo caso, giusto?Dato che ho allocato dinamicamente un attributo acquisito.E se l'avessi allocata dinamicamente nel costruttore della classe astratta il delete dovevo aggiungerlo lo stesso nella classe base?Chi lo distrugge in quel caso un attributo acquisito allocato dinamicamente nel costruttore della classe base?
    Come si aggiungo i codici? Così posto un esempio del mio dubbio
  • Re: [C++]Classe astratta, distruttore.

    Si, il delete[] va messo nel distruttore della classe che alloca l'array. L'unico vincolo che hai è porre virtual il distruttore della classe base in modo da essere sicuro che tutti i distruttori derivati siano invocati correttamente.
    Se hai dubbi posta il codice incriminato così si discute il da farsi.
  • Re: [C++]Classe astratta, distruttore.

    Ecco:
    class Veicolo{
       protected:
       char* Nome;
       private:
       Veicolo(){ Nome=NULL;}
       virtual~Veicolo(){}
    };//classe astratta
    
    class Auto public:Veicolo{
     
       Auto(){           //non devo chiamare il costruttore di default :Veicolo() perché lo sto inizializzando io giusto?
       Nome=new char[11];
       strcpy(Nome,"Automobile");}
      ~Auto(){delete[]Nome;}// devo aggiungerlo qui perché la new sta nella classe derivata, corretto?
    }
  • Re: [C++]Classe astratta, distruttore.

    Una precisazione.
    Il costruttore di default della classe base è sempre eseguito.
    Il resto è corretto.
  • Re: [C++]Classe astratta, distruttore.

    Okok, grazie mille siete stati molto gentili
Devi accedere o registrarti per scrivere nel forum
8 risposte