有没有办法禁用非动态类构造函数? [复制]

Posted

技术标签:

【中文标题】有没有办法禁用非动态类构造函数? [复制]【英文标题】:Is there a way to disable a non-dynamic class constructor? [duplicate] 【发布时间】:2018-05-22 07:33:33 【问题描述】:

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

class Foo

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


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

【问题讨论】:

Afaik 不,为什么要一个? 没有“动态”与“非动态”c'tor。 C'tors 将原始存储初始化为对象。不管存储是如何产生的。 【参考方案1】:

您可以通过将所有构造函数保持私有并将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); 
;

【讨论】:

至少将create设为静态,否则将无法使用。 @hellow 当然这是本意,谢谢。我似乎还没有完全清醒... :-(

以上是关于有没有办法禁用非动态类构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 深入理解系列-构造函数的技巧

我定义了一个非拷贝构造函数;复制构造函数是不是仍会被隐式定义?

拷贝构造函数

为啥隐式复制构造函数调用基类复制构造函数而定义的复制构造函数不调用?

为啥标准不将模板构造函数视为复制构造函数?

OpenGL有没有办法复制现有的VAO