我有一个类对象的实例,我想将其重置为原始状态。 它有一个经过良好测试的构造函数。 通常我会用
之类的代码来做这件事myObject = MyObject{};
但是临时对象太大而无法放在堆栈上。
我的选择是
1)在堆上创建一个默认临时对象
auto* tempObject = make_unique<MyObject>();
myObject = *tempObject;
2)使用新的
进行销毁和重建myObject.~MyObject();
new( &myObject) MyObject();
3)将构造函数代码重构为一个单独的重置函数,该函数从构造函数和其他任何地方调用。
MyObject::MyObject()
{
reset();
}
//and
myObject.reset();
我不喜欢任何选项:1)在一个试图避免不必要的分配的项目中在堆上分配2)是脆弱的和臭的Can I use placement new(this) in operator=? 3)我很懒,想避免如果可以,重构。
我想我真正想问的是还有其他方法我错过了吗?理想情况是否存在可以应用的某种优化,这意味着编译器可以忽略在堆栈上创建临时项并允许我使用我的原始代码?
答案 0 :(得分:1)
最好的 - 始终是基于意见的解决方案。
在通常的做法中,如果您使用OOP并希望重置对象,请编写“重置”功能,该功能可以按您希望的方式完成您想要的操作。
您有基类,因此您可以提供相同的模式,而不会破坏封装或制作脆弱,误导性的解决方案。
P.S。 RAII vs僵尸
答案 1 :(得分:1)
标准容器可能是一种解决方法:
std::vector<MyObject> v(1); // require a capacity of 1
v.emplace_back(); // ok v[0] is now a ref to a heap constructed object
v.pop_back(); // destroys the object
v.emplace_back(); // and rebuilds it normally without any (de-)allocation
但它仍然是一个黑客,当我的意见是正确的解决方案是增加堆栈大小。所有体面的编译器都有它的选择。
无论如何,重置方法也可以是一个很好的和干净的解决方案,只要它在功能的观点上是有意义的(该对象被设计为可重置的)。如果没有,它又是一个黑客。