Prevención de la copia de objetos en C++ (3 formas diferentes)

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:

  1. 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
         ^
    
  2. 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.

  3. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *