Visualizzazione dei risultati da 1 a 7 su 7

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Per evitare tutto questo giro di codice è sufficiente implementare il pattern prototype.
    In questo modo puoi fare semplicemente:
    codice:
    class TipoPuntatore {
        public:
            ...
            virtual TipoPuntatore* clone()=0;
            ...
    };
    
    class Concreta : public TipoPuntatore {
         double d;
         public:
         TipoPuntatore* clone() {
              Concreta* temp = new Concreta;
              temp->d = this->d;
              return temp;
         }
    
    };
    ...
    Prova::Prova(const Prova& da_copiare) {
        mPuntatore = da_copiare.mPuntatore->clone();
    }
    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.

  2. #2
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Per evitare tutto questo giro di codice è sufficiente implementare il pattern prototype.
    Mai avrei pensato di usarlo a questo scopo, o meglio, il problema del costruttore di copia mi ha offuscato la vista sul problema.

    Infatti mi dicevo, ma io devo copiare un dato membro, non un oggetto...ma in realtà il dato membro è un oggetto di cui esiste un'istanza nel momento in cui lo voglio copiare, quindi ben venga il Prototype (che sono andato a rileggermi in quanto non lo avevo mai usato fino ad ora).

    Grazie infinite nuovamente

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    codice:
    Prova::Prova(const Prova& da_copiare) {
        mPuntatore = da_copiare.mPuntatore->clone();
    }
    Una cosa simile l'ho sfruttata anche per fare l'overload dell'operatore=,

    codice:
    void Prova::operator=(const Prova& da_copiare)
    {
      mPuntatore=da_copiare.mPuntatore->clone();
    }
    Però facendo così rischio quasi sicuramente un memory leak: o faccio delete prima di assegnare il nuovo 'valore' a mPuntatore o passo agli smartpointer, credo in questo caso unique_ptr per mPuntatore.

    Con l'operatore di copia non ho questo rischio in quanto sto creando l'oggetto, ho capito giusto?
    Ultima modifica di ing82; 04-06-2016 a 18:36

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.