1

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

4

4 回答 4

7

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

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

class A
{
 public: // or private, doesn't matter.
  A()=delete;
  A(const A&)=delete;
  A(A&&)=delete;
};
于 2012-12-02T10:20:17.873 回答
1

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

class la
{
public:
    virtual void oh_no_you_dont() = 0;
};

int main()
{
    la an_instance;
    return 0;
}

在 GCC 下,我得到以下信息:

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

test.cpp:9:错误:不能将变量“an_instance”声明为抽象类型“la”</p>

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

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

于 2012-12-02T10:36:51.737 回答
0

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

于 2012-12-02T10:21:39.867 回答
0

您是否希望您的课程不被构建?

这是使用旧 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”类。

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

于 2021-03-01T12:49:47.487 回答