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

    [C++] Clonare oggetto complesso

    Ho un oggetto di tipo A che ha due attributi: il nome e un puntatore ad un oggetto di tipo B.
    Inoltre ho un oggetto di tipo B che ha due attributi: il nome e un puntatore ad un oggetto di tipo A.

    Vorrei scrivere un metodo che mi consenta di creare una copia dell'oggetto di tipo A (clonandolo) in modo che il puntatore all'oggetto di tipo B, contenuto in A, puntasse ad una copia identica dell'oggetto di tipo B e non all'originale.

    C'è qualcosa di preconfezionato nel C++? Altrimenti come posso fare?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dovrai operare con un costruttore di copia che effettui una "deep copy" ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ovvero?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Scacchiera.hh:
    codice:
    #ifndef SCACCHIERA_HH
    #define SCACCHIERA_HH
    
    #include "Casella.hh"
    #include "Re.hh"
    #include "Pedone.hh"
    #include "Torre.hh"
    #include "Donna.hh"
    #include "Alfiere.hh"
    #include "Cavallo.hh"
    
    class Scacchiera
    {
    
    	private:
    
    	Casella _scacch[8][8]; 
    	Re* re_bianco;
    	Re* re_nero;
    
    	public:
    
    	Scacchiera ();
      Scacchiera (const Scacchiera& s);
    	~Scacchiera ();
    
    	void inizializza ();
    
    	friend ostream& operator << (ostream& os, Scacchiera ScacchStamp);
    
    };
    
    #endif
    Frammento di Scacchiera.cc (costruttore di copia profonda):
    codice:
    Scacchiera::Scacchiera (const Scacchiera& s)
    {
      for (int i=0;i<8;i++)
        for (int j=0;j<8;j++)
          {
            //???
          }
      re_bianco= dynamic_cast <Re*> (_scacch[(s.re_bianco)->getCasella()->getX()][(s.re_bianco)->getCasella()->getY()].getPezzo());//va controllato T dinamico
      re_nero= dynamic_cast <Re*> (_scacch[(s.re_nero)->getCasella()->getX()][(s.re_nero)->getCasella()->getY()].getPezzo());//va controllato TD
          
    }
    Nella prima parte del costruttore di copia profonda dovrei 'clonare' la matrice di Caselle, ma come faccio?

  6. #6
    Devi creare un costruttore di copia anche per la classe Casella (se anch'essa richiede una deep copy) e copiare una casella alla volta nel nuovo array bidimensionale...
    Se state chiamando per i piedini mancanti,lasciate il vostro indirizzo,e i piedi di ricambio vi saranno consegnati da mio nipote Jody. E ora, io devo ritornare nel dolce abbraccio della cripta... Ma tornerò!!!

    The Simpson ; AABF08 (Domenica orrenda domenica)

  7. #7
    Devo anche ridefinire l'operatore =? Se si, come?

  8. #8
    codice:
    MyClass & operator=(const MyClass &rhs);
    devi copiare il contenuto dei puntatori e, se necessario, allocare nuova memoria per questi

  9. #9
    Mi faresti un esempio sul codice che ho postato sopra?

  10. #10
    Dipende da com'è fatta la classe Casella, ti posso fare un esempio con un'altra classe:
    codice:
    class Persona
    {
    public:
        Persona(const std::string &nome,
            const std::string &cognome)
        {   
            this->nome = nome;
            this->cognome = cognome;
        }
        
        Persona & operator=(const Persona &p)
        {
            this->nome = p.nome;
            this->cognome = p.cognome;
            return *this;
        }
        
    private:
        std::string nome;
        std::string cognome;
    };
    questo dovrebbe farti capire come usare l'operatore =. Non l'ho compilato, quindi non assicuro che funzioni, è solo per fini illustrativi...
    Se state chiamando per i piedini mancanti,lasciate il vostro indirizzo,e i piedi di ricambio vi saranno consegnati da mio nipote Jody. E ora, io devo ritornare nel dolce abbraccio della cripta... Ma tornerò!!!

    The Simpson ; AABF08 (Domenica orrenda domenica)

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.