Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++]Strano comportamento costruttore di copia ridefinito

    Salve a tutti, vi posto quà di seguito il codice di un programmino d'esempio per spiegare il mio problema:

    codice:
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    using namespace std;
    
    struct punto {double x, y;};
    class poligono
    {   int nvertici; punto* pp;
    public:
           poligono();
           poligono (int n, const punto v[]);
           ~poligono();
           poligono(const poligono& pol);
    };
    poligono::poligono()
    {
       nvertici = 1; pp = new punto[nvertici];
    }
    poligono::poligono(int n, const punto v[])
    {
       nvertici = n;
       pp = new punto[nvertici];
       for (int i=0; i<nvertici; i++)
       {
           (pp+i)->x = v[i].x;
           (pp+i)->y = v[i].y;
       }
    }
    poligono::~poligono()
    {
       delete[] pp;
    }
    
    poligono::poligono(const poligono& pol)
    {
       cout<< "costruttore di copia\n";
       nvertici = pol.nvertici;
       pp = new punto[nvertici];
       for (int i= 0; i < nvertici; i++)
       {
           (pp+i)->x = (pol.pp+i)->x;
           (pp+i)->y = (pol.pp+i)->y;
       }
    }
    
    int main()
    {
        punto cc[3];
        poligono bz();
        poligono test = bz; // errore a tempo di compilazione "conversion from poligono()() to non-scalar type poligono requested
        poligono test2 = poligono(3, cc);
        system("PAUSE");
        return EXIT_SUCCESS;
    }

    Nel main ho aggiunto i commenti alle righe che non mi quadrano, innanzitutto l'inizializzazione dell'ogetto "test" di tipo "poligono" con l'ogetto "bz" sempre di tipo "poligono",non capisco proprio perchè mi esca fuori quell'errore quando compilo.
    Secondo cosa che non mi spiego, perchè quando inizializzo l'ogetto di tipo "poligono" test2 con il costruttore "poligono(3, cc)" non viene richamato il costruttore di copia? Da quello che so in quel caso dovrebbe intervenire proprio il costruttore di copia che ho ridefinito, però se mando in esecuzione l'exe non mi esce il cout del costruttore di copia.

    Sapreste darmi qualche dritta?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    poligono bz();

    e' la dichiarazione di una funzione bz che non ha parametri e restituisce un oggetto poligono.

    Per istanziare un oggetto poligono con il costruttore di default, devi scrivere

    poligono bz;

    Una volta istanziato l'oggetto, la riga

    poligono test = bz;

    utilizzera' il costruttore di copia.

    La riga

    poligono test2 = poligono(3, cc);

    e' equivalente

    poligono test2(3, cc);

    Non vedo perche' debba essere chiamato il costruttore di copia.

  3. #3
    Secondo il libro del mio prof con quell'inizializzazione dovrebbe essere richiamato proprio il costruttore di copia.
    A questo punto, visto che sto esaurendo con questo argomento vi riporto un altro piccolo pezzo di codice:

    codice:
    #include <cstdlib>
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    class stringa
    {      char* str;
    public:
           stringa(const char s[]);
           ~stringa();
    };
    stringa::stringa(const char s[])
    {
          str = new char[strlen(s)+1];
          strcpy(str, s);
          cout << "ogetto costruito \n";
    }
    stringa::~stringa()
    {
          delete[] str;
          cout << "ogetto distrutto \n";
    }
    stringa ff()
    {
            stringa sg("acqua");
            return sg;
    }
    
    
    int main()
    {
        stringa sa = ff();
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Allora, secondo quello che ci sta scritto sul libro questo programma non riuscirebbe ad inizializzare l'oggetto classe sa con il risultato della funzione ff poichè al termine della funzione verrebbe chiamato il distruttore dell'oggetto sa, distruttore che va a deallocare l'array str di sa e quindi il risultato sarebbe che sa dovrebbe avere il membro str puntatore ad area di memoria deallocata.

    Io ho provato a compilarlo e va tutto bene, alla fine sa risulta proprio inizializzato con il valore restituito da ff, e non solo, il distruttore dell'oggetto sg non viene mai richiamato.

    Dove sta la verità?

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.