Come posso copiare e modificare l'oggetto con unique_ptr in esso?

1

In pratica ho la seguente situazione:

                         +------------------+
                         |                  |
                         |   Input object   |
                         |                  |
                      +--+------------------+--+
unique_ptr<Subobject 1>                        |unique_ptr<base class of Subobject 2>
                      |                        |
                      |                        |
                      |                        |
                      |                        |
             +--------v--------+     +---------v-------+
             |                 |     |                 |
             |   Subobject 1   |     |   Subobject 2   |
             |                 |     |                 |
             +-----------------+     +-----------------+

Ho una classe che accetta questo oggetto di input, esegue alcuni calcoli e genera un nuovo oggetto di output, che punta in qualche punto indietro all'oggetto di input originale. Ho bisogno di oggetti di input separati per ogni calcolo.
 Ora vorrei essere in grado di mettere in coda più calcoli con oggetti di input molto simili, cioè con Subobject 1 o 2 modificati per un oggetto diverso in modo che un essere umano sia in grado di confrontare i risultati e trovare la soluzione migliore. Poiché gli oggetti sono creati in base ai dati di input XML, ogni volta che ho trovato un elenco di Suboggetti invece di uno solo volevo copiare l'oggetto di livello superiore e scambiare solo i valori che dovevano essere scambiati, ma poi mi sono reso conto che unique_ptr impedisce la copia.
Potrei aver progettato me stesso in un angolo qui, ma c'è un modo per facilitare questo metodo o sono bloccato a ricostruire l'intero oggetto manualmente per ogni permutazione?

    
posta pluczak 22.07.2017 - 11:17
fonte

1 risposta

1

Implementa il costruttore di copie del tuo oggetto di livello superiore ("Oggetto di input") per eseguire una copia profonda dei due sottooggetti. Nel caso di Subobject 2, poiché utilizza un puntatore alla base, potrebbe essere necessario implementare un metodo virtual clone() sul subobject in modo che venga creato il tipo derivato corretto & copiato.

Non è meno un lavoro quindi ricostruire manualmente l'intero oggetto ogni permutazione, ma potrebbe essere più piacevole con cui lavorare.

Tuttavia, se è necessario condividere i dati dell'istanza, sarà necessario passare a std :: shared_ptr.

In entrambi i casi, prendi in considerazione lo spostamento di std :: unique_ptr o std :: shared_ptr nella classe subobject, e fai i subobject nelle classi "handle" che contengono un puntatore alla risorsa e si occupano della semantica della copia appropriata. Quindi l'oggetto esterno non ha bisogno di conoscere i dettagli della condivisione o della copia. Si noti che se si esegue questa operazione, la gerarchia di classi per subobject 2 dovrebbe essere una gerarchia di diversi tipi di classi di risorse, poiché se l'oggetto handle è considerato come valore non può essere più polimorfico in sé ma deve contenere una risorsa polimorfica .

    
risposta data 17.01.2018 - 17:10
fonte

Leggi altre domande sui tag