如何防止构建一个类的对象?

时间:2012-12-02 10:17:48

标签: c++

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

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

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'

     

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

     

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

答案 2 :(得分:0)

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

答案 3 :(得分: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 来代替定义一个类。