Quale sarebbe un motivo non forzato per avere un oggetto con Private Copy Constructor e l'Operatore di assegnazione?

6

Alla ricerca di ragioni non concettuali / non forzate relative a quando è necessario utilizzare un oggetto con un costruttore di copie private e un operatore di assegnazione private ?

Come si risolve questa tecnica / pratica, che qualche altra tecnica non è in grado di risolvere?

    
posta Jarrod Roberson 09.11.2012 - 22:56
fonte

2 risposte

8

Puoi guardare lo standard (che ha flussi).

Gli oggetti stream non sono copiabili perché contengono un buffer non condivisibile.

Se dovessi consentire la copia, dovresti definire la semantica che consentirebbe il trasferimento del buffer e rendere ancora utilizzabile la fonte del trasferimento (cosa significa utilizzare uno stream dopo aver trasferito il suo buffer). Invece hanno deciso che non era possibile copiare.

Il stream non è assegnabile per lo stesso motivo. L'assegnazione è solo l'altra faccia della stessa medaglia (l'assegnazione è solo copia (con sovrascrittura))

    
risposta data 10.11.2012 - 01:33
fonte
6

Ho scritto una classe Rand una volta che gestisce la generazione di numeri casuali. Se ho passato un'istanza Rand in una funzione in base al valore, l'oggetto Rand originale non aggiornava il suo stato iniziale quando il valore copiato ha generato numeri. Naturalmente, avrei potuto rendere lo stato seme allocato da qualche parte non nell'oggetto stesso (come nell'heap). Invece, volevo passare Rand oggetti per riferimento. Per evitare di passarli accidentalmente per valore, ho disabilitato il suo costruttore di copia e l'operatore di assegnazione (rendendoli privati).

Ora volevo che l'utente fosse in grado di copiare effettivamente un oggetto Rand . Ma questo richiede un po 'più di lavoro dal momento che il costruttore di copia e gli operatori di assegnazione erano privati. La mia soluzione era creare una funzione membro RandForwarder Rand::clone() , dove RandForwarder era una classe di amici di Rand in modo che potesse accedere a quei membri privati. Ho anche dato a Rand un costruttore pubblico che ha preso un RandForwarder e un operatore di assegnazione di RandForwarder in modo che gli utenti potessero farlo: Rand r2 = r1.clone(); whille disabilitando Rand r2 = r1;

    
risposta data 10.11.2012 - 01:58
fonte

Leggi altre domande sui tag