2011-10-18 12 views
0

私はC++でチェスゲームを実装していますが、クラスの中には "Board"と "Piece"があります。 "Piece"から継承した "Rook"、 "King"などのクラスがあります。エラー:タイプに名前を付けません

したがって、ボードは2次元配列なので、board.hにはpiece.hが含まれています。

最近の開発(動作の実装について)では、ボードにアクセスできるようにしたいと思っていました。 したがって、piece.hにはboard.hが含まれていました。

これで上記のエラーが発生します。

いくつかのコード:board.h

//Function in piece.h 
#include "board.h" 
bool Piece::move(int toX, int toY, bool enemyPawn, const Board & b) 
 
Error: Board does not name a type 
Error: ISO C++ forbids declaration of ‘b’ with no type [-fpermissive] 
+1

どのようにボードを定義しますか? –

+0

Piece :: moveの定義がうまくいくので、問題はboard.hにある可能性があります。 –

+0

これらは、board.h '#include" bishop.h "' '#include" king.h "' '#include"ナイトのインクルードです。H "' ' の#include "pawn.h"' ' の#include "queen.h"' ' の#include "rook.h"' だから私はワンピースが含まれることはありません直接 – TheDudeAbides

答えて

1

移動では参照のみが使用されるため、間違いなくboard.hのインクルードを避けることができ、クラスBoardを先に宣言することができます。あなたが実際にボードについて知っておく必要があるならば、あなたはボード(純粋な要約)へのインターフェイスクラスを宣言し、ボードの代わりにそのインターフェイスを含めて、ボードをインターフェイスから派生させるようにすることができます

1

は:include piece.h前に(!セミコロン)class Board;を置きます。
piece.hinclude board.hの前に、class Piece;(セミコロン付き!)を入れます。
一般に、ヘッダーにクラスを定義すると、がファイルの先頭に配置されます。は、いずれもを含みます。

あなたは循環依存と呼ばれるものを持っています。両方のヘッダーはお互いを含めようとし、失敗した場合(ガードを含む場合)または無限ループ(ガードなし)のいずれかで失敗します。いずれにしても、この「前方宣言」は問題を解決するはずです。

クラスが一緒に縛られていて、これで修正されない場合は、それらを解凍する必要があります。ピース/ビショップ/キング/ etcの関数定義をそれぞれの.cppファイルに移動します(存在しない場合)。board&board*(ただし値はではありません)のみを使用し、class board; 。これはコンパイラに「不明な」ボードタイプが存在し、ポインタと参照によってそれを渡すことができることを伝えます。次にpiece.hにはの依存関係はなく、board.hのように正しくファイルに含めることができます。

+0

私は使用を行う(ソリューションが論理的であるが)警備員が含まれ、それが唯一のより多くのエラーがスローされます 不完全型「構造体ワンピース」が無効な使用 'struct Piece'の前方宣言 – TheDudeAbides

+0

インクルードの上にある前方宣言( 'class Board;')は機能しませんでしたか? –

+0

より多くのエラーが発生します(入れ子になった名前で使用されている構造体の不完全色が宣言されていません) – TheDudeAbides

1

これは循環依存です。私が最近読んだヒントの1つは、両方のクラスを、それぞれが他のクラスについて知っているように、単一のヘッダーファイルでどのように定義するかを想像することです。答えは、あなたはできません。

循環依存関係を解除するには、ヘッダーファイルを含めるのではなく、いずれかのクラスに対して前方宣言を使用する必要があります。 #include "board.h"ではなく、ちょうどclass Board;を実行します。