Ann*_*inn 3 c++ scope api-design raii
我在堆栈上有一个对象需要另一个对象作为它的构造函数,如下所示:
{
ObjectDef def(importantData); // should die as soon as obj is created
def.setOptionalData(100);
Object obj(def); // should live for the remainder of the function body
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我喜欢将变量def放在自己的范围内.这给了我"def"的名字,并且清楚地表明它不再有用了.
例如,result我想做的事情是obj:
// scope block
{
int result = complexFunction() + anotherFunction();
printf("the result is %i", result);
doMoreThingsWithIt(result);
}
// "result" is now gone
Run Code Online (Sandbox Code Playgroud)
但问题是,我无法在这里做到这一点,我可以看到.构造函数Object obj不能在范围之前,因为它是构造函数需要的def,并且它不能在范围内,因为obj需要存活的时间比def.
无论如何要将限制def的范围缩短obj,或者我应该接受它必须至少保持一定的范围?
你可以使用lambda:
Object obj{[&]{ ObjectDef def{importantData}; def.setOptionalData(100); return def; }()};
Run Code Online (Sandbox Code Playgroud)
如果ObjectDef经常需要它的可选数据集并且这是一种常见模式,请考虑添加一个构造函数,以ObjectDef允许设置可选数据或创建一个命名辅助函数来完成lambda在这里完成的工作.