1

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


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);
    }
}

我将如何做到这一点(不使用初始化函数)?

编辑:我更新了示例。现在它显示默认构造函数必须最后出现。如果没有,displayWindow 将不会考虑任何更新的变量。

4

3 回答 3

5

像这样:

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

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

于 2012-08-24T16:27:18.403 回答
0

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

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

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

于 2012-08-24T19:44:11.397 回答
-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);
    }
}

我听说这有一些警告,如果有人能指出它们,我将不胜感激。

于 2012-08-24T18:30:12.453 回答