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)
但是x,y和*z仍然可以存在.该怎么办?我对这两种情况都感兴趣; 静态/堆栈分配和堆分配.
Rei*_*ica 14
一种选择是为类提供纯虚函数,并将其标记为final:
struct A final
{
virtual void nonconstructible() = 0;
};
Run Code Online (Sandbox Code Playgroud)
如果你想要只有static成员,那么写namespace A而不是struct A.继承代码在语法上是相似的.
要防止创建类的实例,请将其设为抽象.(包括一个纯虚函数).但这样做会在您的课程中引入一个v-table,您可能不需要它.
如果您想要实例化类,则可以声明私有构造函数:
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)