Con frecuencia me topo con el problema, que debo extender un constructor de copia generado por el compilador. Ejemplo:Cómo puedo extender un constructor de copia generado por el compilador
class xyz;
class C
{
...
int a, b, c;
std::set<int> mySet;
xyz *some_private_ptr;
};
Supongamos, que some_private_ptr
solamente se debe copiar en ciertas condiciones. Para otras condiciones, debe restablecerse al NULL
en la copia. Así que tengo que escribir un constructor de copia como:
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;
}
El problema es que la clase podría tener un número de miembros de datos, y que muy probablemente se olvide de actualizar el constructor de copia cuando agrego un miembro de datos. Sería muy bueno si pudiera escribir.
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;
}
Esto haría que mi código sea más seguro y más fácil de mantener. Lamentablemente, no conozco esa posibilidad. ¿Hay alguna?
+1 por esta buena idea ... viendo esto borré mi publicación: P – Nawaz
@Fred, ¡gracias por la edición! Quise decir "copia por defecto", pero me perdí la * copia *, supongo que ahora es lo mismo ... – Nim
Sabía lo que querías decir, pensé que era un simple error. :) "Predeterminado" es complicado porque "ctor predeterminado" tiene un significado específico, "copiador generado por compilador" o simplemente "generado por cctor" es menos ambiguo. –