我正在尝试用C ++创建一个需要多个对象构造函数的对象。说Foo()
和Foo(int)
Foo(int)
然后调用Foo()
。简化代码如下:
#include <iostream>
class Foo{
private:
int iX;
public:
void printX(string sLabel){
cout << sLabel << " : " << " Foo::iX = " << Foo::iX << endl;
};
void setX(int iX){
Foo::iX = iX;
Foo::printX("setX(void) Method");
};
Foo(){
Foo::iX = 1;
Foo::printX("Foo(void) Constructor");
};
Foo(int iX){
Foo::setX(iX);
Foo::printX("Foo(int) Constructor");
Foo::Foo();
Foo::printX("Foo(int) Constructor");
};
};
int main( int argc, char** argv ){
Foo bar(2);
return 0;
}
其输出为
setX(void) Method : Foo::iX = 2
Foo(int) Constructor : Foo::iX = 2
Foo(void) Constructor : Foo::iX = 1
Foo(int) Constructor : Foo::iX = 2
结果表明setX
方法按预期工作。 <{1}}等于该函数范围内外的Foo::iX
。
但是,当从2
构造函数中调用Foo(void)
构造函数时,Foo(int)
仅在该构造函数中保持等于Foo::iX
。一旦退出该方法,它就会恢复为1
。
所以我的问题是双重的:
答案 0 :(得分:10)
Foo::Foo();
中的 Foo::Foo(int)
未按预期调用当前对象的默认构造函数。它只构造一个临时的Foo
,它与当前对象无关。
您可以使用delegating constructor(自C ++ 11开头):
Foo(int iX) : Foo() {
// ...
};
请注意Foo::Foo()
将在Foo::Foo(int)
的正文之前调用。
避免重复代码的另一种方法是使用setX()
作为常用的初始化方法。 (如果不合适,可以换一个新的。)
Foo() {
setX(1);
// ...
};
Foo(int iX) {
setX(iX);
// ...
};
答案 1 :(得分:4)
如果能够使用C ++ 11编译器,则可以使用委托构造函数。
// Use Foo(int) to initialize the object when default constructor is used.
Foo() : Foo(1) {}
答案 2 :(得分:3)
可以从另一个构造函数中调用构造函数。你只是忘了分配返回值。
*this = Foo::Foo();
对于问题2,您需要delegating constructors。
Foo(int iX) : Foo() {
...
}