-1

作曲用に次のコードがあります。エラーが発生し、

#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 Y :: callGetX()'x'が宣言されていません(最初にこの関数を使用してください)

私が見逃したものはありますか?このシナリオのコンストラクター呼び出しメカニズムを教えてもらえますか?

4

2 に答える 2

4
X x(3);

これは C++ では合法ではありません (Java AFAIK では合法です)。実際、コンパイラは、 classのメンバー変数を考慮するのではなく、xclass のオブジェクトを返すメンバー関数であると考えます。XxX

代わりにこれを行います:

Y(int j = 0) : jY(j), x(3) { cout <<"Constructing Y.."<<endl; }
于 2012-05-05T16:35:28.603 に答える
3

メンバーを初期化リストに入れます。

Y(int j = 0) : x(3), jY(j)

あなたの構文:

class Y
{
private:
   X x(3);
//...
};

違法です。

于 2012-05-05T16:26:03.413 に答える