2012-05-05 30 views
-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(); 
} 

エラー:メンバ関数のボイドYで :: callGetX() 'X' 宣言されていない(最初にこの機能を使用する)

は、私が見逃しているものはありますか? 誰でもこのシナリオのコンストラクタコールメカニズムを教えていただけますか?

+5

あなたはどのようなエラーを取得している:

は、代わりにこれを行いますか?これは完全に有効です: 'X x(5);'。これは、それは言うメンバ関数voidYで あなたの問題に関連していないが、 'の#include ' '代わりの#include "のiostream"' – mfontanini

+1

別の問題のように思える。なぜあなたはエラーを生成するコードを投稿しないのですか? –

+0

:: callGetX() X宣言されていない(最初にこの機能を使用する) –

答えて

3

あなたの初期化リストにメンバーを置く:

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

あなたの構文:

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

は違法です。

4
X x(3); 

これはC++では有効ではありません(Java AFAIKでは有効です)。実際には、xは、Xのメンバ変数xを考慮する代わりに、クラスXのオブジェクトを返すメンバ関数であるとコンパイラが考えるようになります。

Y(int j = 0) : jY(j), x(3) { cout <<"Constructing Y.."<<endl; } 
+0

はい、うまくいきました! –

関連する問題