我想在调用第二个构造函数之前进行一些处理。例如:
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不会考虑任何更新的变量。
答案 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);
}
}
我听说有一些警告,如果有人能指出,我会非常感激。