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在这里完成的工作.
归档时间: |
|
查看次数: |
350 次 |
最近记录: |