如何禁止建造物体?

Ori*_*ent 8 c++ memory-management memory-layout c++11 c++14

如何禁止构造物体?我将= delete;所有相关的特殊功能标记如下:

struct A
{
    A() = delete;
    A(A const &) = delete;
    A(A &&) = delete;
    void * operator new(std::size_t) = delete;
    void operator delete(void *) = delete;
};
A x{};
A y = {};
A * z = ::new A{};
Run Code Online (Sandbox Code Playgroud)

LIVE EXAMPLE

但是x,y*z仍然可以存在.该怎么办?我对这两种情况都感兴趣; 静态/堆栈分配和堆分配.

Rei*_*ica 14

一种选择是为类提供纯虚函数,并将其标记为final:

struct A final
{
  virtual void nonconstructible() = 0;
};
Run Code Online (Sandbox Code Playgroud)

[实例]

  • 您也可以使用纯虚拟析构函数创建类抽象而不是纯虚函数. (2认同)
  • @Hassan我唯一可以想到的是OP在注释中提到的 - 只有静态成员的`X`,但能够传递`X`作为模板参数(排除了使用名称空间为`X`) . (2认同)

Bat*_*eba 6

  1. 如果你想要只有static成员,那么写namespace A而不是struct A.继承代码在语法上是相似的.

  2. 要防止创建类的实例,请将其设为抽象.(包括一个纯虚函数).但这样做会在您的课程中引入一个v-table,您可能不需要它.


sky*_*ing 6

如果您想要实例化类,则可以声明私有构造函数:

class NotInstantiable {
private:
    NotInstatiable();

public:
};
Run Code Online (Sandbox Code Playgroud)

而不是NotInstantiable进一步定义.现在无法实例化,因为首先是构造函数,private但是还没有提供构造函数的定义.

NotInstantiable例如,禁用这种可能性的第二个障碍是禁止这种可能性,实际上这是另一种众所周知的模式:

class NotInstantiable {
private:
    NotInstantiable();

public:
    NotInstantiable* evil_method()
    {
        return new NotInstantiable(); // this will fail if there's no body of the constructor.
    }
};
Run Code Online (Sandbox Code Playgroud)