有没有办法禁用非动态类构造函数?

时间:2018-05-22 07:33:33

标签: c++ class c++17 new-operator

想象一个只能用new运算符构造的类。是否有可能在c ++ 17标准中实现这一点而不删除它的析构函数?

class Foo
{
    Foo(){}
    ~Foo(){}
    // delete non-dynamic constructor...?
}

// ...
Foo A; // compiling error
Foo* B = new Foo(); // ok

1 个答案:

答案 0 :(得分:3)

您可以通过将所有构造函数保密并将new的强制调用包装在工厂函数中来轻松完成此操作。

您还应该禁用复制课程。

class Foo
{
private:
  Foo() {}
  Foo(const Foo&) = delete;
  Foo& operator= (const Foo&) = delete;

public:
  ~Foo() {}

  static std::unique_ptr<Foo> create() { return std::unique_ptr<Foo>(new Foo{}); }
};