Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306

    [c++] classe coda e pila

    Ho visto nel libro che nella stesura della classe Pila realizzata con array statico, nella parte private mette il costruttore di copia e l'overload dell'operatore = , entrambi con corpo vuoto.

    Poi quando va a graficare il codice, non ce lo mette.
    A questo vi chiedo: ce li devo mettere ugualmente? visto che il corpo delle due funzioni è vuoto?

    e poi nella realizzazione della pila dinamica, credo che ce lo devo mettere sia il costruttore di copia che l'overload dell'operatore =, ma in questo caso devo esplicitarlo il corpo delle due funzioni?

    stesso ragionamento per le code?

  2. #2

    Re: [c++] classe coda e pila

    Originariamente inviato da Alfoxx
    Ho visto nel libro che nella stesura della classe Pila realizzata con array statico, nella parte private mette il costruttore di copia e l'overload dell'operatore = , entrambi con corpo vuoto.

    Poi quando va a graficare il codice, non ce lo mette.
    A questo vi chiedo: ce li devo mettere ugualmente? visto che il corpo delle due funzioni è vuoto?
    Se non li metti il compilatore genera automaticamente un costruttore di copie (ma non l'operatore di assegnamento) che copia tutti i campi della classe di origine nella nuova istanza. Se imposti un costruttore di copie vuoto disabiliti quello fornito implicitamente dal compilatore, ma se non ci scrivi dentro niente ovviamente non copierà un bel niente. Quindi, o lasci quello fornito dal compilatore oppure lo implementi correttamente.

    In alternativa, puoi rendere la classe non-copiabile (e dimenticarti di questi problemi) dichiarando un costruttore di copia privato e senza definizione.
    e poi nella realizzazione della pila dinamica, credo che ce lo devo mettere sia il costruttore di copia che l'overload dell'operatore =, ma in questo caso devo esplicitarlo il corpo delle due funzioni?
    Nel caso di una pila realizzata con un array dinamico devi sicuramente scriverli esplicitamente, dato che quello di default si limiterebbe a copiare il puntatore all'array dinamico, ottenendo così che le due pile condividono lo stesso array interno (e, al momento della distruzione, si avrebbe una doppia delete dello stesso array).

    Nota comunque che scrivere costruttore di copia/operatore di assegnamento/distruttore correttamente è molto meno banale di quanto possa sembrare.
    stesso ragionamento per le code?
    Sì.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    grazie mille e buona domenica

    mi potresti consigliare qualcosa in italiano? ma soprattutto con un modo più semplice di scrivere il codice

    le cose sono semplici in teoria però per implementarlo non credo di saperlo fare, non avendolo mai visto.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    non basta implementarlo come una semplice costruttore di copia?

    Coda (const coda & c)
    coda=c.coda;
    testa=c.testa;
    nelem=c.nelem;
    codice:
    Coda (const coda & c) 
    coda=c.coda; 
    testa=c.testa; 
    nelem=c.nelem;

  5. #5
    Stai parlando di code implementate come liste linkate giusto? In tal caso, otterresti un nuovo oggetto di tipo coda che condivide i dati dell'oggetto da cui è stato creato, visto che testa e coda puntano alla stessa lista linkata, e tra l'altro i nodi della lista vengono distrutti dai distruttori di entrambi gli oggetti, il che provoca un crash (se ti va bene) o bug "silenziosi" (se ti va male). Quello che devi fare è copiare nella nuova lista tutti gli elementi, creando una nuova lista linkata.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    quindi se questa cosa non va bene
    dove la prendo la soluzione?

    ho trovato su un forum una cosa del genere

    codice:
    Coda::Coda(const Coda& coda){ 
        if(!coda.qempty()){ 
            testa=new tipoProcesso; 
            testa->idProcesso=(coda.testa)->idProcesso; 
            testa->idUtente=(coda.testa)->idUtente; 
            Pr temp=(coda.testa)->succ; 
            Pr temp1=testa; 
            while(temp!=NULL){ 
                temp1->succ=new tipoProcesso; 
                temp1=temp1->succ; 
                temp1->idProcesso=temp->idProcesso; 
                temp1->idUtente=temp->idUtente; 
                temp=temp->succ; 
            } 
            temp1->succ=NULL; 
        } 
        else testa=0;

    ma è da pazzi fare una cosa del genere: almeno io così a prim vista non la capisco

  7. #7
    Il concetto è quello anche se, se hai già implementato metodi per l'inserimento di elementi nella coda, ti basta usare quelli per copiare tutti gli elementi della coda di origine nella coda di destinazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    ti mostro ciò che ho fatto per la coda dinamica

    metto solo l'implementazione del push poichè hai detto qualcosa sull'inserimento.

    codice:
    typedef int E;
    struct record;
    typedef record *P;
    struct record { E elem; P punt;}
    
    
    class coda{
    private:
    P testa, coda;
    
    public:
    coda () {testa=0;}
    coda( const coda & c)   //che è quello che vorrei capire come fare
    ~coda()
    const &operator =(const coda $ c)  //anche questo dovrei sviluppare fare
    
    
    void push(E e);
    void pop (E & e);
    bool empty() {return testa ==0;}
    bool full() {return false;}
    
    }
    
    
    
    void Coda::push (E e){
    P q=new record;
    q->elem=e;
    if(testa ==0) {testa = q;}
    else {coda->punt=q;}
    q->punt=0;
    coda=q;}




    come sviluppo ciò che mi hai detto?

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.