首页 > 解决方案 > 有没有办法禁用非动态类构造函数?

问题描述

想象一个只能用new操作符构造的类。是否可以在不删除其析构函数的情况下在 c++17 标准中实现这一点?

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

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

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

解决方案


您可以通过将所有构造函数保持私有并将强制调用包装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{}); }
};

推荐阅读