Spesso mi imbatto nel problema, che devo estendere un costruttore di copia generato dal compilatore. Esempio:Come estendere un costruttore di copie generato dal compilatore
class xyz;
class C
{
...
int a, b, c;
std::set<int> mySet;
xyz *some_private_ptr;
};
assumere, che some_private_ptr
dovrebbe essere copiati solo a determinate condizioni. Per altre condizioni, è necessario reimpostare su NULL
in copia. Quindi devo scrivere un costruttore di copia come:
C::C(const C &other) :
a(other.a),
b(other.b),
c(other.c),
mySet(other.mySet)
{
if(CanCopy(other.some_private_ptr)) // matches condition
some_private_ptr = other.some_private_ptr;
else
some_private_ptr = NULL;
}
Il problema è che la classe potrebbe avere un certo numero di membri di dati, e che molto probabilmente può dimenticare di aggiornare il costruttore di copia quando aggiungo un membro di dati. Sarebbe molto bello se potessi scrivere.
C::C(const C &other) :
C::default_copy(other)
{
if(CanCopy(other.some_private_ptr)) // matches condition
some_private_ptr = other.some_private_ptr;
else
some_private_ptr = NULL;
}
Ciò renderebbe il mio codice più sicuro e più facile da mantenere. Purtroppo non conosco questa possibilità. C'è qualche?
+1 per questa bella idea .. visto questo ho cancellato il mio post: P – Nawaz
@Fred, grazie per la modifica! Avevo intenzione di dire "default copy ctor", ma mi mancava la * copia *, immagino che ora significhi la stessa cosa ... – Nim
Sapevo cosa volevi dire, pensavo fosse un semplice refuso. :) "Default" è complicato perché "default ctor" ha un significato specifico, "copy ctor generato dal compilatore" o semplicemente "cctor generato" è meno ambiguo. –