我无法在任何地方找到答案。它可以通过使用条件和抛出异常来完成,但还有其他方法吗?
答案 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
来代替定义一个类。