0

在 main() 的整个生命周期中,我需要一个 MyClass 对象,但前提是某些标志useMyObject为真。

  • 我相信声明MyClass myObject运行构造函数。真的吗?我没能找到它。
  • 如果是,我怎样才能避免调用构造函数两次?

构造函数获取我只想获取一次且仅在设置了标志时才获取的资源。这是我的代码:

int main() {
    MyClass myObject;
    // ...
    if ( useMyObject ) {
        myObject = MyClass(42);
    }
    // ...
}
4

3 回答 3

6

一个简单的方法是使用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.
}
于 2013-09-12T08:16:56.493 回答
2

是的,当您声明对象时,将运行构造函数。
如果需要,您可以改用 astd::unique_ptr并初始化对象。
但是,这可能会使您的代码中到处都是 if,因此可能有更好的方法来安排代码。

于 2013-09-12T08:17:04.613 回答
0
MyClass& getMyObject()
  static MyClass myObject(42);
  return myObject;
}

如果您实际上不需要该对象但只是想确保它存在,甚至可以调用它:

int main() {
    // ...
    if ( createMyObjectNow ) {
        getMyObject();
    }
    // ...
}
于 2013-09-12T08:21:39.897 回答