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

    Help costruttori di copia [C++]

    Ciao a tutti mi presento sono Paolo e vi scrivo per chiedervi un aiuto. Non riesco a capire cosa non va nel codice che vi allego. In particolare, voglio semplicemente dichiarare un oggetto derivato in una funzione esterna (non membro) e passarlo al main. Come fare?

    Grazie in anticipo
    Paolo

    #include<iostream.h>
    #include<string.h>
    #include<stdio.h>

    class animal
    {

    protected:
    int zampe;
    char *alim;

    public:

    animal();

    animal(const animal &ogg){
    alim = new char[10];
    strcpy(alim,ogg.alim);
    zampe = ogg.zampe;
    cout <<"Costruzione di COPIA animal"<<endl;
    }

    ~animal(); //Distruttore
    void set_zampe(int z){ zampe = z; return;}
    void set_alim(char *s){
    strcpy(alim,s); return;}
    int get_zampe(){ return zampe;}
    char* get_alim(){ return alim; }
    };

    animal::animal()
    {
    alim = new char[10];
    if(!alim) cout<<"Errore nella allocazione"<<endl;
    else cout <<"Costruzione di animal"<<endl;
    }

    animal::~animal()
    {
    cout<<endl<<"Distruzione di animal"<<endl;
    delete alim;
    }



    class scimmie: public animal
    {
    char *razza;

    public:

    scimmie(){ razza = new char [10]; cout<<"costruttore di scimmia"<<endl;}
    scimmie(const scimmie &ogg);


    ~scimmie(){ delete razza; cout<<"distruttore di scimmia"<<endl;}
    void set_razza(char *r){ strcpy(razza,r); return;}
    char *get_razza(){ return razza;}

    };

    scimmie::scimmie(const scimmie &ogg): animal(ogg) {

    razza = new char [10];
    strcpy(razza,ogg.razza);
    cout <<"Costruzione di COPIA scimmie"<<endl;
    }

    scimmie visu()
    {


    scimmie U;
    char *cibo, *razza;
    int zampe;

    cibo = new char [10];
    razza = new char [10];

    cout<<"Inserire il n.ro di zampe:"<<endl;
    cin>>zampe;
    cout<<"Inserire l'alimentazione:"<<endl;
    gets(cibo);
    cout<<"Inserire la razza:"<<endl;
    gets(razza);

    //Inizializzazione

    U.set_zampe(zampe);
    U.set_alim(cibo);
    U.set_razza(razza);

    cout<<endl;


    return U;
    }

    main()
    {

    scimmie T; //ATTENZIONE: SE METTO scimmie T = visu(); FUNZIONA! PERCHE' COSI' NO? THANKS!

    T = visu();

    cout<<"Il n.ro di zampe è: "<<T.get_zampe()<<endl;
    cout<<"Il cibo e: "<<endl;
    puts(T.get_alim());
    cout<<"La razza è: "<<endl;
    puts(T.get_razza());


    return 1;
    }

  2. #2
    Forse perchè quando assegno T all'oggetto ritornato da visu() non viene implicitamente chiamato il costruttore di copia e quando l'oggetto temporaneo va fuori scopo (al termine della assegnazione) perdo le variabili puntatore e quindi anche quelle che risiedono in T. Invece, inizializzando T in questo modo: scimmie T = visu(); il costruttore di copia e' chiamato intrinsecamente e preserva i dati.
    Me lo potete confermare?
    Esiste un modo migliore per risolvere il problema, magari nel caso in cui abbia già un oggetto e non lo debba inizializzare?

    Grazie

    Paolo

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Effettivamente le cose stanno come dici, all'incirca.
    Quando tu scrivi:
    codice:
    scimmie T = visu();
    Viene invocato il costruttore di copia.
    Invece con questo procedimento:
    codice:
    scimmie T;
    T = visu();
    Prima T viene inizializzato ai valori di default richiamando il costruttore senza argomenti, quindi viene effettuata un'assegnazione. Per risolvere il problema devi ricorrere all'overload degli operatori.

  4. #4
    Grazie mille!

    Ciao

    Paolo

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.