Рубрики

Как создать класс C ++, объекты которого могут быть распределены только динамически?

Проблема состоит в том, чтобы создать класс таким образом, чтобы не динамическое размещение объекта вызывало ошибку компиляции. Например, создайте класс «Test» со следующими правилами.

Test t1;  // Должен сгенерировать ошибку компилятора

Test *t3 = new Test; // Должно работать нормально

Идея состоит в том, чтобы создать частный деструктор в классе. Когда мы создаем приватный деструктор, компилятор генерирует ошибку компилятора для нединамически размещенных объектов, потому что компилятору необходимо удалить их из сегмента стека, когда они не используются.
Поскольку компилятор не отвечает за освобождение динамически размещаемых объектов (программист должен явно их освободить), у компилятора с ними не возникнет никаких проблем. Чтобы избежать утечки памяти, мы создаем дружественную функцию destructTest (), которая может вызываться пользователями класса для уничтожения объектов.

#include <iostream>

using namespace std;

  
// Класс, объект которого может быть создан только динамически

class Test

{

private:

    ~Test() { cout << "Destroying Object\n"; }

public:

     Test() { cout << "Object Created\n"; }

friend void destructTest(Test* );

};

  
// Только эта функция может разрушать объекты Test

void destructTest(Test* ptr)

{

    delete ptr;

    cout << "Object Destroyed\n";

}

  

int main()

{

    / * Раскомментирование следующей строки вызовет ошибку компилятора * /

    // Test t1;

  

    // создаем объект

    Test *ptr = new Test;

  

    // уничтожаем объект, чтобы избежать утечки памяти

    destructTest(ptr);

  

    return 0;

}

Выход:

Object Created
Destroying Object
Object Destroyed

Если мы не хотим создавать дружественную функцию, мы также можем перегрузить операторы delete и delete [] в Test, таким образом нам не нужно вызывать определенную функцию для удаления динамически размещаемых объектов.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Как создать класс C ++, объекты которого могут быть распределены только динамически?

0.00 (0%) 0 votes