如何防止类对象的构造?

How to prevent construction of a class's object?

本文关键字:对象 何防止      更新时间:2023-10-16

>我在任何地方都找不到答案。这可以通过使用条件和抛出异常来完成,但是还有其他方法可以做到这一点吗?

目前尚不清楚为什么你想要一个在任何情况下都无法构造的类,但你可以让所有构造函数private并且不为它们提供任何实现。这将阻止在编译时进行构造。

在 C++11 中,您可以将 delete 用于所有构造函数:

class A
{
 public: // or private, doesn't matter.
  A()=delete;
  A(const A&)=delete;
  A(A&&)=delete;
};

嗯,这是一个有点糟糕的黑客,但坦率地说,任何需要一种方法来定义不可构造对象的C++应用程序可能已经是一个可怕的黑客了!

class la
{
public:
    virtual void oh_no_you_dont() = 0;
};
int main()
{
    la an_instance;
    return 0;
}

在海湾合作委员会下,我得到以下内容:

test.cpp: 在函数 'int main()' 中:

test.cpp:9:错误:无法将变量"an_instance"声明为抽象类型"la"

test.cpp:2:注意:因为以下虚函数在"la"中是纯的:

test.cpp:4: 注意:虚拟虚空 la::oh_no_you_dont()

您可以将所有构造函数设为私有。这样就不可能创建类的实例。然后,您可以提供一个或多个静态工厂方法来创建类,从而使用户仅使用工厂方法。

你想让你的类被构造吗?

这是一个具有旧C++标准的解决方案,例如 C++03 及更早

版本
class A {
private:
  A();
  A(const A&)
  A(A&&);
  ~A()
};

以下是使用最新C++标准的解决方案,例如 C++11、C++14、C++17、C++20

class A
{
  A()=delete;
  A(const A&)=delete;
  A(A&&)=delete;
};

甚至

class A final {
  ~A() = delete;
}

final表示不能从中继承类。

析构函数的delete意味着不能析构类

禁止析构函数也会阻止您构造对象。

为什么我们要禁止建造/破坏对象?

一个非常常见的用例是开发人员希望在C++中创建"静态"类。

C++中的"静态"类是指仅具有静态方法的类。

此模式也称为"util"类。

许多人建议不要定义类,而是使用包含static函数的规范namespace来实现此目的。