Как мы можем отключить прямое создание объекта и разрешить создание с помощью нового и умного указателя?
Другими словами, я пытаюсь понять, возможно ли форсировать создание экземпляров с помощью выделения кучи. Я бы не стал делать это на производстве, просто хочу посмотреть, можно ли это сделать.
Делая деструктор приватным, я могу отключить непосредственное создание объекта (например: 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 оказывается несколько проблематичным.