¿Cómo hacer una clase de C++ cuyos objetos solo se pueden asignar dinámicamente?

El problema es crear una clase tal que la asignación no dinámica del objeto provoque un error del compilador. Por ejemplo, cree una clase ‘Prueba’ con las siguientes reglas. 

CPP

Test t1;  // Should generate compiler error
Test *t3 = new Test; // Should work fine

La idea es crear un destructor privado en la clase. Cuando creamos un destructor privado, el compilador generaría un error de compilación para los objetos no asignados dinámicamente porque el compilador necesita eliminarlos del segmento de la pila una vez que no están en uso. Dado que el compilador no es responsable de la desasignación de objetos asignados dinámicamente (el programador debe desasignarlos explícitamente), el compilador no tendrá ningún problema con ellos. Para evitar la fuga de memoria, creamos una función amiga, destructTest() , a la que los usuarios de la clase pueden llamar para destruir objetos. 

CPP

#include <iostream>
using namespace std;
 
// A class whose object can only be dynamically created
class Test
{
private:
    ~Test() { cout << "Destroying Object\n"; }
public:
    Test() { cout << "Object Created\n"; }
friend void destructTest(Test* );
};
 
// Only this function can destruct objects of Test
void destructTest(Test* ptr)
{
    delete ptr;
    cout << "Object Destroyed\n";
}
 
int main()
{
    /* Uncommenting following line would cause compiler error */
    // Test t1;
 
    // create an object
    Test *ptr = new Test;
 
    // destruct the object to avoid memory leak
    destructTest(ptr);
 
    return 0;
}

Producción:

Object Created
Destroying Object
Object Destroyed

Complejidad de tiempo : O(1)

Espacio Auxiliar: O(1)

Si no queremos crear una función amiga, también podemos sobrecargar los operadores delete y delete[] en Test, de esta manera no tenemos que llamar a una función específica para eliminar objetos asignados dinámicamente. 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 *