我有以下代码构成。它会产生错误,
#include <iostream>
using namespace std;
class X
{
private:
int iX;
public:
X(int i=0) : iX(i) { cout <<"Constructing X.."<<endl; }
~X() { cout <<"Destructing X.."<<endl; }
int getIX() { return iX; }
};
class Y
{
private:
X x(3);
int jY;
public:
Y(int j = 0) : jY(j) { cout <<"Constructing Y.."<<endl; }
~Y() { cout <<"Destructing Y.."<<endl; }
void callGetX() { cout <<"iX is "<<(x.getIX())<<endl; }
};
int main()
{
Y yObj(1);
yObj.callGetX();
}
错误: 在成员函数void void Y :: callGetX() 'x'未声明(首先使用此功能)
有什么我错过的吗? 任何人都可以告诉我这个场景的构造函数调用机制吗?
答案 0 :(得分:4)
X x(3);
这在C ++中是不合法的(在Java AFAIK中是合法的)。实际上,它使编译器认为x
是一个成员函数,它返回类X
的对象,而不是考虑x
类X
的成员变量。
而是这样做:
Y(int j = 0) : jY(j), x(3) { cout <<"Constructing Y.."<<endl; }
答案 1 :(得分:3)
您将该成员放入初始化列表中:
Y(int j = 0) : x(3), jY(j)
您的语法:
class Y
{
private:
X x(3);
//...
};
是非法的。