一个简单的方法是使用std::unique_ptr
:
std::unique_ptr<MyClass> myObjectPtr;
if(useMyObject)
myObjectPtr.reset(new MyClass(42));
if(myObjectPtr)
myObjectPtr->method();
但请注意,这将需要堆分配,这实际上可能比“空”构造更昂贵。为了避免堆分配的成本,您可以使用boost::optional
类似于指针的用法,但实际上对象的存储是在堆栈上分配的:
boost::optional<MyClass> myObject;
if(useMyObject)
myObject = MyClass(42);
if(myObject)
myObject->method();
正如您在上述任何情况下看到的那样,代码将充满条件。
如果您被允许更改 MyClass 我建议只使用非参数构造函数构造一个“空”对象。您只需要将对象构造成它实际上什么都不做的状态,但如果使用它不应该使应用程序崩溃。那个空的结构应该很便宜,而且它只是一次性的成本。
如果您可以将对象移动到实际使用它的范围并完全避免未初始化/空对象,那就更好了:
if(useMyObject) {
MyClass myObject(42);
// use the object here and nowhere else.
}