构造函数调用

时间:2012-05-05 16:23:06

标签: c++ composition

我有以下代码构成。它会产生错误,

#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'未声明(首先使用此功能)

有什么我错过的吗? 任何人都可以告诉我这个场景的构造函数调用机制吗?

2 个答案:

答案 0 :(得分:4)

X x(3);

这在C ++中是不合法的(在Java AFAIK中是合法的)。实际上,它使编译器认为x是一个成员函数,它返回类X的对象,而不是考虑xX的成员变量。

而是这样做:

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

是非法的。