如何防止类对象的构造?
How to prevent construction of a class's object?
>我在任何地方都找不到答案。这可以通过使用条件和抛出异常来完成,但是还有其他方法可以做到这一点吗?
目前尚不清楚为什么你想要一个在任何情况下都无法构造的类,但你可以让所有构造函数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
来实现此目的。
- 防止临时对象文件访问 MSVC 中的磁盘
- 防止在按值传递对象(继承)时进行切片
- 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?
- 防止通过接口删除对象
- 创建对象并防止被破坏
- 如何防止构造函数在引发异常时创建对象
- c++ 防止类共享静态对象
- 防止const函数被调用非const对象
- 防止 std::在对象上移动
- 防止删除对象上的函数调用
- 防止在执行时将两个类中的两个对象转换为 bool:if(a!=b)
- 成员初始值设定项列表的使用如何防止在c++中创建冗余对象
- 对象文件"Version References"从何而来?
- 如何防止类对象的构造?
- 我可以防止对象被 std::memcpy 复制吗?
- 我可以防止 std::sort 复制传递的比较对象吗?
- 将指针分配给临时对象--如何防止它
- 防止将对象强制转换为除一种类型C++之外的任何类型
- 如何防止线程使用的对象被丢弃?如何控制对象的生存期
- 对象具有防止匹配的类型限定符(未找到函数重载)