2012-01-13 9 views
2

私はこのような状況を持っている:他のクラスへの参照として渡したい、メンバを初期化したいですか?

class GEngine { 
private: 
    ChessBoard board; 
    ChessMoves checkBoard(board); 
... 

とChessMoves c'torは、このように定義されています

class ChessMoves { 
private: 
    ChessBoard nullChessBoard; 
    ChessBoard const& refBoard; 
    Flags cBoard[8][8]; //checkboard 
public: 
    ChessMoves():refBoard(nullChessBoard){resetcBoard();} 
    ChessMoves(ChessBoard const& ref):refBoard(ref){resetcBoard();}; 

が、それはこのエラーを返す:

GameEngine.cpp:250: error: ‘((GEngine*)this)->GEngine::checkBoard’ does not have class type 
GameEngine.cpp:251: error: ‘((GEngine*)this)->GEngine::checkBoard’ does not have class type 
GameEngine.cpp:251: error: ‘((GEngine*)this)->GEngine::checkBoard’ does not have class type 

私はこのコードを実行すると:

私は他のクラスへの参照として渡し、初期化したいがメンバーである:

class X{ 
private: 
    ref const& _Mreference; 
public: 
    X(ref const& ref):_Mreference(ref){} 
}; 

よう

何かが、それは可能ですか?

+1

はい、可能ですが、あなたはエラーを解決していません。 251行目で何をしようとしていますか? –

+0

私はそれを取得しません。 'checkBoard'は' board'型の引数を取る関数ですか? –

+0

私は思っていない場合、彼は最も厄介な構文解析を打つ:) –

答えて

3

あなたはこの

ChessMoves checkBoard(board); 

を行うと、あなたがクラススコープGEngine内の関数を宣言しています。これは無効な宣言でもあります(ボードは型ではないため、コンパイラからの他のエラーメッセージがあります)。あなたが行うと

checkBoard.fillcBoard(from); 

あなたのコンパイラはGEngine::checkBoardはクラス型ではないので違法であると宣言関数のメンバ関数にアクセスするには何を考えている(ただし、関数型は、コンパイラが言うことthatsの)。あなたが何をしたいか

はこれです:

class GEngine { 
private: 
    ChessBoard board; 
    ChessMoves checkBoard; 
... 

// In the implementation file 
GEngine::GEngine() : board(), checkBoard(board) {} 

そして、それは問題ないはずです。クラスメンバーが宣言の順番で初期化されるので、クラス内の宣言の順序は決して変更しないようにしてください(ただし、混乱させる場合は、コンパイラが警告する必要があります。その警告を真剣に受けてください)。

1

checkboardの宣言は無効です。そのようなクラスのオブジェクトを初期化することはできません(少なくともC++ 03ではなく、私が知っているコンパイラではC++ 11の機能をサポートしていません)。このようにコンストラクタで行う必要があります:

class GEngine {   
private: 
    ChessBoard board; 
    ChessMoves checkBoard; 
public: 
    GEngine() 
     :checkBoard(board) 
    {} 
}; 
関連する問題