Muchas veces, el usuario desea que una instancia de una clase de C++ no se copie en absoluto. Entonces, la pregunta es ¿cómo logramos esto?
Hay tres maneras de lograr esto:
- Mantener el constructor de copia y el operador de asignación de copia como privados en la clase.
A continuación se muestra la implementación de C++ para ilustrar cómo se puede hacer esto.
#include <iostream>
using
namespace
std;
class
Base {
int
x;
public
:
Base() { }
Base(
int
y): x(y) { }
private
:
// Copy constructor
Base(
const
Base& obj) : x(obj.x) { }
// copy assignment operator
Base& operator=(
const
Base& tmp_obj)
{
x = tmp_obj.x;
return
*
this
;
}
};
int
main()
{
Base b1(10);
Base b2(b1);
// calls copy constructor
b2 = b1;
// calls copy assignment operator
return
0;
}
NOTA: Este código no se compila ya que no podemos copiar el objeto de esta clase y, por lo tanto, mostrará este error.
prog.cpp: In function 'int main()': prog.cpp:18:2: error: 'Base::Base(const Base&)' is private Base(const Base &obj) : x(obj.x) //Copy constructor ^ prog.cpp:33:12: error: within this context Base b2(b1); // Calls copy constructor ^ prog.cpp:22:8: error: 'Base& Base::operator=(const Base&)' is private Base& operator = (const Base& tmp_obj) // copy assignment operator ^ prog.cpp:35:5: error: within this context b2 = b1; // calls copy assignment operator ^
- Heredar una clase ficticia con un constructor de copia privada y un operador de asignación de copia privada.
A continuación se muestra la implementación de C++ para ilustrar cómo se puede hacer esto.
#include <iostream>
using
namespace
std;
class
Dummy {
public
:
Dummy() { }
private
:
Dummy(
const
Dummy& temp_obj) { }
Dummy& operator=(
const
Dummy& temp_obj) { }
};
class
Base :
public
Dummy {
int
x;
public
:
Base() { }
Base(
int
y) : x(y) { }
};
int
main()
{
Base b1(10);
Base b2(b1);
// Calls copy constructor
b2 = b1;
// Calls copy assignment operator
return
0;
}
prog.cpp: In function 'int main()': prog.cpp:12:5: error: 'Dummy::Dummy(const Dummy&)' is private Dummy(const Dummy &temp_obj) ^ prog.cpp:22:7: error: within this context class Base: public Dummy ^ prog.cpp:16:12: error: 'Dummy& Dummy::operator=(const Dummy&)' is private Dummy& operator = (const Dummy &temp_obj) ^ prog.cpp:22:7: error: within this context class Base: public Dummy
NOTA: Este código no se compila ya que no podemos copiar el objeto de esta clase y, por lo tanto, mostrará este error.
- Uso del constructor de copia eliminado y el operador de asignación de copia : las dos formas anteriores son bastante complejas, C++ 11 ha encontrado una solución más simple, es decir, simplemente elimine el constructor de copia y el operador de asignación.
A continuación se muestra la implementación de C++ para ilustrar:
// CPP program to demonstrate use Delete copy
// constructor and delete assignment operator
#include <iostream>
using
namespace
std;
class
Base {
int
x;
public
:
Base() { }
Base(
int
y) : x(y) { }
Base(
const
Base& temp_obj) =
delete
;
Base& operator=(
const
Base& temp_obj) =
delete
;
};
int
main()
{
Base b1(10);
Base b2(b1);
// Calls copy constructor
b2 = b1;
// Calls copy assignment operator
return
0;
}
prog.cpp: In function 'int main()': prog.cpp:24:15: error: use of deleted function 'Base::Base(const Base&)' Base b2(b1); // Calls copy constructor ^ prog.cpp:16:5: note: declared here Base(const Base &temp_obj) = delete; ^ prog.cpp:26:8: error: use of deleted function 'Base& Base::operator=(const Base&)' b2 = b1; // Calls copy assignment operator ^ prog.cpp:17:11: note: declared here Base& operator = (const Base &temp_obj) = delete; ^
NOTA: Este código no funciona porque no podemos copiar el objeto de esta clase y, por lo tanto, mostrará este error.
Referencia:
https://ariya.io/2015/01/c-class-and-preventing-object-copy
Este artículo es una contribución de MAZHAR IMAM KHAN . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA