Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    27

    [c++]Dubbio Costruttore -costruttore di Copia ecc.

    codice:
    class Automobile{
    
    private:
    list <Componente> componenti;
    string modello;
    
    public:
    Automobile();  //1
    Automobile(const Automobile& a);  //2
    bool operator=(const Automobile& a);  //3
    bool operator == (const Automobile & a);  //4
    
    double costo();
    {
      double sum=0,
       for(list<Componente>::iterator i=componenti.begin() ; i!=componenti.end() ; i++)
        sum+= i->Costo();
    
    return sum;
    }
    
    bool aggiungiComponente(Componente c)
    {
        if(!c.compatibileCon(modello))
          return false;
     
     for(list<Componente>::iterator i=componenti.begin() ; i!=componenti.end() ; i++)
       if( !i->compatibileCon (c) )
           return false;
     
            componenti.push_back(c);
             return true;
    
    }
    
    
      };
    Ciao ciao ,qualcuno gentilmente mi potrebbe dire come si fa l'implementazione del costruttore ,costruttore di copia,dell'op di assegnamento e di uguaglianza(linee 1,2,3,4) di questo eserc.???
    Mi mette in difficolta la lista di componenti...

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Immagino sia un esercizio, perché la classe di per se avrebbe solo bisogno dell'operatore di uguaglianza.
    Intanto la dichiarazione dell'operatore di assegnamento è sbagliata (controlla meglio dove stai studiando per vedere quella giusta).
    Detto questo, devi copiare i dati a uno a uno e se uno di questi dati è complesso (un array, una lista, uno stack o altro) devi applicare lo stesso princiop a ogni dato contenuto in questi dati complessi.
    Nel caso puramente didattico della lista è:
    codice:
    Automobile(const Automobile& a) {
        for(list<Componente>::iterator i=a.componenti.begin() ; i!=a.componenti.end() ; i++)
            componenti.push_back(*i);
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    27

    [c++] controllo su operatore di assegnamento e di uguaglianza.

    Si grazie per l'accorgimento ,piccolo errore di distrazione..
    non è che potresti dirmi se ho fatto bene o corregermi nel caso??, con particolare attenzione sull 'operatore di uguaglianza.Gentilmente.
    Come mai prima hai scritto che la classe avrebbe bisogno solo dell'operatore di ug?
    Cioe' quali sono i casi in cui la classe ha bisogno solo dell'operatore di uguaglianza.?

    codice:
    automobile::automobile(const automobile& a)
    {
      modello=a.modello;
         for(list<componente>::const_iterator it=a.componenti.begin() ; it!=a.componenti.end() ; it++)
           componenti.push_back(*it);
    }
    
    automobile& automobile::operator=(const automobile& a)
    {
         modello = a.modello;  
    
               for(list<componente>::const_iterator it=a.componenti.begin() ; it!=a.componenti.end() ; it++)
           componenti.push_back(*it);       
    
    }
    
    
    bool automobile::operator == (const automobile& a)
    { 
     list<componente>::iterator it2=componenti.begin();
      
       for(list<componente>::const_iterator it1=a.componenti.begin() ; it1!=a.componenti.end() ; it1++)
           {
                       if(*it2 !=*it1 )
                            return false;          
    
                     it2++;
            }      
    
          if( modello== a.modello    )
                return true;
    
    return false;
    }

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    codice:
    automobile& automobile::operator=(const automobile& a)
    {
         modello = a.modello;  
    
               for(list<componente>::const_iterator it=a.componenti.begin() ; it!=a.componenti.end() ; it++)
           componenti.push_back(*it);       
    return *this; // obbligatorio che sia sempre l'ultima riga.
    }
    Qui c'è un'imprecisione: restituisci true quando la stringa è uguale all'altra a prescindere che la lista sia uguale all'altra o no. Inoltre dai per scontato che le liste siano lunghe uguali, il che quasi mai è vero.
    Corretto è:
    codice:
    bool automobile::operator == (const automobile& a)
    { 
         // se le due liste sono di lunghezza diversa non sono uguali.
         if (componenti.size() != a.compomenti.size()) return false;
    
    // ok
     list<componente>::iterator it2=componenti.begin();
       for(list<componente>::const_iterator it1=a.componenti.begin() ; it1!=a.componenti.end() ; it1++)
           {
                       if(*it2 !=*it1 )
                            return false;          
    
                     it2++;
            }      
    
          // se le due stringhe non sono uguali...
          if( modello!= a.modello    )
                return false;
    
    // se non esce prima, i due oggetti sono uguali.
    return true;
    }
    Come mai prima hai scritto che la classe avrebbe bisogno solo dell'operatore di ug?
    Cioe' quali sono i casi in cui la classe ha bisogno solo dell'operatore di uguaglianza.?
    I fab four (non mi ricordo chi li abbia chiamati così) che sono:
    costruttore di default, costruttore di copia, operatore di assegnamento, distruttore;
    sono indispensabili quando il tipi nativi contenuti nella classe sono puntatori.
    Se assegni o copi un oggetto a un altro e questo oggetto ha un puntatore, il compilatore farà una copia bit a bit dell'oggetto, quindi quando il puntatore sarà rilasciato nel distruttore, la memoria sarà liberata due volte. La prima va a buon fine, la seconda: BUM!
    Tu però in questa classe usi due tipi "intelligenti" che già da soli forniscono costruttore di copia e operatore di assegnamento, quindi quando il compilatore copierà/assegnerà il tuo oggetto a un altro, automagicamente invocherà costruttore di copia/operatore di assegnamento per ognuno di questi tipi "intelligenti".
    L'operatore di uguaglianza invece lo devi fornire tu ( consigliato anche quello di disuguaglianza: non è provviso in automatico ), perché, per esempio la std::list, non fornisce tale operatore come invece la std::string.
    Infine vorrei farti notare come gli esempi siamo puramente didattici.
    Ad esempio per copiare la lista in un altra (riprendendo l'operatore di assegnamento), ci sono modi meno complicati per farlo, a partire da:
    codice:
    componenti = a.componenti;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    27
    guarda ti ringrazio tantissimo, cmq io ancora non sono riuscito a risolvere il mio problema :
    perchè nn mi viene inizializzato S cn il contenuto di a1????
    quando faccio la stampa su S mi viene stampato solo il modello della macchina di a1 ma NON la sua lista. cosi:
    a1.stampa(); // stampa questo:
    y10
    y10-23-1999
    y10-100-2000
    y10-10-1989
    y10-77-1999

    S.stampa(); // mentre
    solo y10

    // allora mi chiedo forse non copia tutto il contentuto di a1 in S???
    // vedi main...

    ti prego rixp
    codice:
    int main()
    {
    componente c1("y10",23,1999);
    componente c2("y10",100,2000);
    componente c3("y10",10,1989);
    componente c4("y10",77,1999);
    componente c5("bmw",200,1999);
    componente c6("punto",22,1999);
    
    
    automobile a1
    a1.setModello("y10");
    
    automobile S=a1;  ///1    
    
    a1.aggiungiComponente(c1);
    a1.aggiungiComponente(c2);
    a1.aggiungiComponente(c3);
    a1.aggiungiComponente(c4);
    a1.aggiungiComponente(c5);
    
    a1.stampa();
    S.stampa();
    
    return 0;
    }

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Intanto una precisazione. Mi era sfuggito un particolare non da poco ( che comunque non c'entra col tuo problema immediato).
    Nell'operatore di assegnamento, prima di copiare gli elementi della lista, devi svuotare la lista componenti in cui devi copiare, altrimenti gli elementi di a.componenti vengono accodati a quelli presenti in componenti a causa della push_back().
    basta un componenti.clear()

    Per quanto riguarda il tuo problema:
    S viene copiato prima o dopo l'inserimento dei componenti in a?
    E se lo copi dopo che succede?
    Il costruttore di copia, copia quello che trova non quello che vorresti avere.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    27

    risolto

    Grazie tante mi 6 stato di grande aiuto . Ho risolto finalmenteeeeeeeeeee ...

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.