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

    [C++] copia di strutture realizzate con classi

    ciao a tutti,
    ho creato una coda rappresentata tramite una struttura dinamica costituita
    da record contenenti l'elemento "e" e il puntatore all'elemento
    successivamente inserito. Ho definito una classe "Coda" che ha due variabili
    private: "testa" e "coda" che puntano al primo e all'ultimo arrivato. La
    classe implementa ovviamente i classici metodi pop, push, top...oltre
    ovviamente al costruttore (inizializza testa=0) e il distruttore.
    Nel main ho istanziato l'oggetto con: Coda c.
    La domanda è: come faccio a creare una nuova coda identica a c, ossia che
    abbia gli stessi elementi???
    Per prima cosa devo definire il costruttore di copia, giusto?

    Coda(const Coda& c){ testa=c.testa; coda=c.coda; }; //costruttore di copia

    come proseguo per creare un "clone" della coda creata dall'utente???

    ciao!
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  2. #2
    Questa potrebbe essere una possibile soluzione:

    Coda::Coda(const Coda& c){
    pointer q = c.coda;
    if (q!=0){
    coda = new persona;
    coda->nome=q->nome;
    testa=coda;
    q=q->succ;
    while(q!=0){
    testa->succ = new persona;
    testa = testa->succ;
    testa->nome = q->nome;
    q=q->succ;
    }
    testa->succ=0;
    }
    else cout<<"Coda Vuota";
    }
    dove sono stati definiti:

    struct persona{
    string nome;
    persona* succ;
    };
    typedef persona* pointer;
    Fammi sapere se ci sono problemi.
    A presto.
    La luce è più veloce del suono,ecco xchè alcune persone sembrano brillanti fino a quando non parlano


  3. #3
    Originariamente inviato da m@ximo

    Fammi sapere se ci sono problemi.
    A presto.
    puoi commentarlo brevemente?


    P.S stai ad ingegneria?
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  4. #4
    codice:
    /* Definiamo una struct di tipo persona con un campo nome 
                  e un puntatore alla struct stessa  */
    struct persona{
           string nome;
           persona* succ;
    };
    
    typedef persona* pointer;    //Defiamo un tipo puntatore a persona
    
    Coda::Coda(const Coda& c) {
           pointer q = l.coda;   //Creiamo un puntatore d'appoggio
           if (q!=0){        //Testiamo se la lista da copiare è vuota   
                 coda = new persona;   //Allochiamo una nuova struct
                 coda->nome=q->nome;   //Copiamo i campi
                 testa=coda;       //Inizializziamo il puntatore di testa
                 q=q->succ;  //Avanziamo col punt. nella coda da copiare
                 while(q!=0){  //Cicliamo fino a che non termina la coda
                             testa->succ = new persona; //Accodiamo nuove struct
                             testa = testa->succ;
                             testa->nome = q->nome;
                             q=q->succ;
                 }
                 testa->succ=0; //Poniamo il campo succ dell'ultima struct a zero
           }
           else cout<<"Lista Vuota";
    
    }
    Spero così vada bene.

    P.S. Sì
    La luce è più veloce del suono,ecco xchè alcune persone sembrano brillanti fino a quando non parlano


  5. #5
    Originariamente inviato da m@ximo

    Spero così vada bene.

    P.S. Sì
    perfetto, grazie!! Nel caso di una coda o di una lista la struttura copiata è ordinata in modo identico all'originale, ma se si tratta di una pila adottando questo metodo non si ottiene una nuova pila con gli elementi ordinati al contrario?

    ciao!

    PS: devi dare anche tu Programmazione I???
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  6. #6
    Nel caso di una Pila, la tua struttura dati dovrebbe essere costituita da un solo puntatore (quello di testa) visto che la gestione è di tipo FIFO, pertanto quando crei il costruttore di copia forse ti conviene usare due puntatori di appoggio, uno per la Pila da copiare e l'altro per la Pila copia.



    P.S. già dato.
    La luce è più veloce del suono,ecco xchè alcune persone sembrano brillanti fino a quando non parlano


  7. #7
    Veramente per generalizzare tutto cio` si ricorre al costruttore di copia per ogni elemento, dato che i contenitori in C++ e` meglio implementarli con dei templates. Il problema nasce quando gli oggetti del contenitore sono polimorfici. A quel punto dovresti utilizzare un cosiddetto "costruttore virtuale", di cui il metodo clone() di Object in Java e` un ottimo esempio.

  8. #8
    Originariamente inviato da m@ximo
    Nel caso di una Pila, la tua struttura dati dovrebbe essere costituita da un solo puntatore (quello di testa) visto che la gestione è di tipo FIFO, pertanto quando crei il costruttore di copia forse ti conviene usare due puntatori di appoggio, uno per la Pila da copiare e l'altro per la Pila copia.



    P.S. già dato.
    modificando il tuo codice ho implementato anche la copia di una lista, fammi sapere se trovi errori:

    codice:
    //funzione Copia elemento per elemento
    void lista::listacopy(const lista& l) {
           Pr q = l.l;   //Creiamo un puntatore d'appoggio
           if (q!=0){        //Testiamo se la lista da copiare è vuota   
                 l = new Record;   //Allochiamo una nuova struct
                 l->elem=q->elem;   //Copiamo i campi
                 l=q;       //Inizializziamo il puntatore di testa
                 q=q->punt;  //Avanziamo col punt. nella lista da copiare
                 while(q!=0){  //Cicliamo fino a che non termina la lista
                             l->punt = new Record; //Accodiamo nuove struct
                             l = l->punt;
                             l->elem = q->elem;
                             q=q->punt;
                 }
                 l->punt=0; //Poniamo il campo punt dell'ultima struct a zero
           }
           else cout<<"Lista Vuota";
    
    }
    questa è la definizione della classe lista:

    codice:
    typedef int E;
    struct Record{
           E elem;
           Record* punt;
           };
    typedef Record* L;
    
    class lista{
          private:
          L l;
          void inserisciric(L& l, E e);
          void eliminaric(L& l, E e);
          void elimina_testa(L& l);
          public:
          lista(){l=0;}
          ~lista();
          void push(E e);
          void pop(E e);
          void inserisci(E e){ inserisciric(l,e);}
          void elimina(E e){ inserisciric(l,e);}
          bool empty(){ return (l==0);}
          void top(E e);
          };
    nel main creo l'oggetto con:

    lista l;

    domanda: come faccio a rendere la funzione listacopy un costruttore di copia e non una semplice funzione membro???

    ciao!
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  9. #9
    Originariamente inviato da r0x
    Veramente per generalizzare tutto cio` si ricorre al costruttore di copia per ogni elemento, dato che i contenitori in C++ e` meglio implementarli con dei templates. Il problema nasce quando gli oggetti del contenitore sono polimorfici. A quel punto dovresti utilizzare un cosiddetto "costruttore virtuale", di cui il metodo clone() di Object in Java e` un ottimo esempio.
    lo so ma si tratta di un esercizio, dubito cmq che arriveremo ai templates...
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  10. #10
    Credo ci siano degli errori nella tua soluzione:

    1) l = q non fa altro che dire ad l di puntare allo stesso elemento della classe da copiare, cosa che non deve accadere visto che il costruttore di copia "crea" un nuovo oggetto a partire da uno esistente; pertanto questa istruzione va tolta.

    2) Per evitare di perdere la testa della tua lista è necessario un altro puntatore di appoggio, in modo tale che quando l avanza la testa resta invariata.

    La soluzione che ti propongo l'ho provata teoricamente e dovrebbe funzionare, se hai problemi la provo anche nel programma.

    N.B. La sintassi per la creazione del costruttore di copia è:
    codice:
    lista::lista(const lista& l) { }
    codice:
    //funzione Copia elemento per elemento
    lista::lista(const lista& lista) {
           punt q = lista.l;   //Creiamo un puntatore d'appoggio
           if (q!=0){        //Testiamo se la lista da copiare è vuota   
                 l = new Record;   //Allochiamo una nuova struct
                 l->elem=q->elem;   //Copiamo i campi
                 punt t = l;
                 q=q->punt;  //Avanziamo col punt. nella lista da copiare
                 while(q!=0){  //Cicliamo fino a che non termina la lista
                     l->punt = new Record; //Accodiamo nuove struct
                     l = l->punt;
                     l->elem = q->elem;
                     q=q->punt;
                 }
                 l->punt=0; //Poniamo il campo punt dell'ultima struct a zero
           }
           else cout<<"Lista Vuota";
    
    }
    Spero vada bene.
    In bocca al lupo!

    Max
    La luce è più veloce del suono,ecco xchè alcune persone sembrano brillanti fino a quando non parlano


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 © 2024 vBulletin Solutions, Inc. All rights reserved.