我在任何地方都找不到答案。可以通过使用条件和抛出异常来完成,但是还有其他方法吗?
4 回答
目前尚不清楚为什么您想要一个在任何情况下都无法构造的类,但是您可以创建所有构造函数private
并且不为它们提供任何实现。这将阻止编译时的构造。
在 C++11 中,您可以使用delete
所有构造函数:
class A
{
public: // or private, doesn't matter.
A()=delete;
A(const A&)=delete;
A(A&&)=delete;
};
好吧,这有点糟糕,但坦率地说,任何需要一种方法来定义不可构造对象的 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()
您可以将所有构造函数设为私有。这样就不可能创建类的实例。然后,您可以提供一个或多个静态工厂方法来创建类,从而使用户只使用工厂方法。
您是否希望您的课程不被构建?
这是使用旧 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