在执行一些代码后可以显式调用构造函数吗?

时间:2012-08-24 16:20:14

标签: c++ constructor

我想在调用第二个构造函数之前进行一些处理。例如:


class Foo {
    Foo(){ displayWindow(); }

    //This is possible
    Foo(int bar) : Foo() { windowSize = bar; }

    //But how do I do processing before calling the second constructor?
    Foo(int bar, int baz) {
        addLabel(baz); // prototype = void addLabel(int)
        Foo(bar);
    }
}

如何完成此操作(不使用初始化函数)?

编辑:我更新了这个例子。它现在显示默认构造函数HAS最后发生。如果没有,displayWindow不会考虑任何更新的变量。

3 个答案:

答案 0 :(得分:5)

像这样:

Foo(int bar, int baz) :
    Foo(initializeAnotherStaticLibrary(bar, baz) == -1 ? bar : baz)
{
}

(请注意,委托构造函数是仅在C ++ 11中支持的功能。)

答案 1 :(得分:0)

如果有合理的默认值,请使用它们。那回避了如何调用其他构造函数的整个问题,因为只有一个。 :)

class Foo {
  public:
    Foo(int bar = 100, int baz = 0) {
        if (baz) addLabel(baz);
        displayWindow();
        windowSize = bar;
    }
};

虽然我质疑在构造函数中调用displayWindow()的想法。除了在你完全初始化自己之前开始工作的丑陋 ......如果对象没有被构建,会发生什么? (例如,如果你有一个Foo的子类,它的构造函数将在此之后运行 - 如果你有任何虚拟的东西,vtable可能不会指向你认为它们的位置...)

答案 2 :(得分:-1)

我发现这可以通过展示位置运算符实现:


class Foo {
    Foo(){ displayWindow(); }

    //This is not possible either, since "type 'Foo' is not a direct base of 'Foo'"
    Foo(int bar) : Foo() { windowSize = bar; }

    //This is the solution using the placement operator
    Foo(int bar, int baz) {
        addLabel(baz);
        new (this) Foo(bar);
    }
}

我听说有一些警告,如果有人能指出,我会非常感激。