Отключение прямого создания, позволяющего создавать только через NEW и умный указатель - PullRequest
0 голосов
/ 28 апреля 2018

Как мы можем отключить прямое создание объекта и разрешить создание с помощью нового и умного указателя?

Другими словами, я пытаюсь понять, возможно ли форсировать создание экземпляров с помощью выделения кучи. Я бы не стал делать это на производстве, просто хочу посмотреть, можно ли это сделать.

Делая деструктор приватным, я могу отключить непосредственное создание объекта (например: Test t;). Я хочу, чтобы принудительное создание экземпляра через новый (это работает) или умный указатель, как unique_ptr.

Я полагаю, что я делаю что-то не так с тем, как я подхожу к unique_ptr, но я не уверен, что.

#include<iostream>
#include<string>
#include<memory>
using namespace std;

class Test
{
private:
    ~Test() {cout << "x" << endl;}
public:
    Test() {cout << "c" << endl;}
    static void destruct(Test* ptr) {delete ptr;}  //Doesn't need to be static
};

int main()
{
    //Perfect
    //We want to disable direct creation. This fails and we want it to fail.
    //Test t;  ERROR: Can't because dest is private!

    //OK   
    Test *ptr = new Test;       //Creation via new works fine
    ptr->destruct(ptr);         //Destruct works fine

    //NOT OK. :-(
    //auto up = make_unique<Test>();  //error
    //unique_ptr<Test> up( new Test(), [](Test* p){destruct(p);} );     //error
    //unique_ptr<Test> up( new Test(), [](Test* p){Test::destruct(p);} );     //error
    unique_ptr<Test> up( new Test(), [](Test* p){p->destruct(p);} );     //error

    return 0;
}

Приведенный выше трюк работает с NEW, который является старой школой C ++. С другой стороны, unique_ptr оказывается несколько проблематичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...