我需要一个MyClass对象用于main()的整个生命周期,但仅当某个标志useMyObject为true 时才需要.
MyClass myObject运行构造函数.真的吗?我无法查找它.构造函数抓取一个我只想抓取一次的资源,并且只有在设置了标志时才抓取.这是我的代码:
int main() {
MyClass myObject;
// ...
if ( useMyObject ) {
myObject = MyClass(42);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
一个简单的方法是使用std::unique_ptr:
std::unique_ptr<MyClass> myObjectPtr;
if(useMyObject)
myObjectPtr.reset(new MyClass(42));
if(myObjectPtr)
myObjectPtr->method();
Run Code Online (Sandbox Code Playgroud)
但请注意,它需要堆分配,实际上可能比"空"构造更昂贵.为了避免堆分配的成本,您可以使用boost::optional与指针类似的方法,但实际上对象的存储是在堆栈上分配的:
boost::optional<MyClass> myObject;
if(useMyObject)
myObject = MyClass(42);
if(myObject)
myObject->method();
Run Code Online (Sandbox Code Playgroud)
正如您在上述任何一种情况中看到的那样,代码将充满条件.
如果允许您更改MyClass,我建议您使用非参数构造函数构造一个"空"对象.您只需要将对象构造为实际上什么都不做的状态,但如果使用它不应该使应用程序崩溃.那空的建筑应该很便宜,而且反正只需要一次性费用.
如果你可以将对象移动到实际使用它的范围并且完全避免未初始化/空对象,那就更好了:
if(useMyObject) {
MyClass myObject(42);
// use the object here and nowhere else.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |