Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C++] Distruttore nn chiamato

    Ciao raga,
    ho appena iniziato a programmare in C++!!!

    Sto implementando le mie prime classi e da quanto ho capito alla fine della funzione in cui è creato l'oggetto è distrutto dall'apposito distruttore (ovvio!!!).

    Implementando questo codice :

    codice:
     #include <iostream>
    using namespace std;
    
    #define SIZE 100
    
    // Creazione della classe stack.
    class stack {
      int stck[SIZE];
      int tos;
    public:
      stack();  // costruttore
      ~stack(); // distruttore
      void push(int i);
      int pop();
    };
    
    // costruttore dello stack
    stack::stack()
    {
      tos = 0;
      cout << "Stack inizializzato\n";
    }
    
    // distruttore dello stack
    stack::~stack()
    {
      cout << "Stack distrutto\n";
    }
    
    void stack::push(int i)
    {
      if(tos==SIZE) {
        cout << "Stack esaurito.\n";
        return;
      }
      stck[tos] = i;
      tos++;
    }
    
    int stack::pop()
    {
      if(tos==0) {
        cout << "Stack vuoto.\n";
        return 0;
      }
      tos--;
      return stck[tos];
    }
    
    int main()
    {
      stack a, b;  // crea due oggetti della classe stack
    
      a.push(1);
      b.push(2);
    
      a.push(3);
      b.push(4);
    
      cout << a.pop() << " ";
      cout << a.pop() << " ";
      cout << b.pop() << " ";
      cout << b.pop() << "\n";
    
      return 0;
    }
    Vedo che l'output è quello che voglio tranne per il fatto che il distruttore nn comunica nessun messaggio, come da me messo per controllare l'avvenuta chiamata.

    Forse il linker di DevC++ fa pena? bho!

    Mi postate il vostro output, grazie!
    Linguaggi : C/C++
    SO: WinXP, Slack 10

  2. #2
    Già ma prova così:
    codice:
    #include <iostream>
    using namespace std;
    
    #define SIZE 100
    
    // Creazione della classe stack.
    class stack {
      int stck[SIZE];
      int tos;
    public:
      stack();  // costruttore
      ~stack(); // distruttore
      void push(int i);
      int pop();
    };
    
    // costruttore dello stack
    stack::stack()
    {
      tos = 0;
      cout << "Stack inizializzato\n";
    }
    
    // distruttore dello stack
    stack::~stack()
    {
      cout << "Stack distrutto\n";
    }
    
    void stack::push(int i)
    {
      if(tos==SIZE) {
        cout << "Stack esaurito.\n";
        return;
      }
      stck[tos] = i;
      tos++;
    }
    
    int stack::pop()
    {
      if(tos==0) {
        cout << "Stack vuoto.\n";
        return 0;
      }
      tos--;
      return stck[tos];
    }
    
    int main()
    {
      stack *a, *b;  // crea due oggetti della classe stack
      a = new stack();
      b = new stack();
      a->push(1);
      b->push(2);
    
      a->push(3);
      b->push(4);
    
      cout << a->pop() << " ";
      cout << a->pop() << " ";
      cout << b->pop() << " ";
      cout << b->pop() << "\n";
      delete a;
      delete b;
      return 0;
    }
    Evidentemente il istruttore viene chiamato solo per allocazioni nello heap e non nello stack di sistema, (non lo sapevo neanche io confesso)
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Lo penso anche io!

    Però solo sotto Win!

    Il prof. con c++ sotto Linux ha fatto girare l'esempio senza problemi!!!
    Linguaggi : C/C++
    SO: WinXP, Slack 10

  4. #4
    A me funziona il codice originario (come è giusto che sia, i distruttori vengono sempre chiamati alla fine del loro blocco di codice, non importa se stack o heap)

    Che versione del compilatore usi?
    Io Mingw 3.3.1

    P.S. Dev-C++ è solo l'IDE, il compilatore\linker è Mingw (che poi è un port di GCC)


  5. #5
    Ma tu usi DevC++?
    Linguaggi : C/C++
    SO: WinXP, Slack 10

  6. #6
    Si, ma come ti ho detto Dev-C++ è solo l'IDE (cioè l'interfaccia grafica)... il compilatore è Mingw

  7. #7
    A me da lo stesso problema di Habdul,uso Mingw sotto xp.
    In effetti ine teoria il distruttore dovrebbe essere chiamato sempre,inspiegabilmte però in questo caso devo trarre la conclusione che non è così,alrimenti non si spiega il comportamento del programma.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Che versione di Mingw usate?

    Dal prompt di DOS digitate
    gcc -v

    e vedrete la versione

  9. #9
    Originariamente inviato da gandalf45
    Che versione di Mingw usate?

    Dal prompt di DOS digitate
    gcc -v

    e vedrete la versione
    3.3.1
    Linguaggi : C/C++
    SO: WinXP, Slack 10

  10. #10
    3.3.1
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.