2012-02-24 10 views
3

海戦ゲームを作成したい。私は2つのクラスを持っています:船とセル。 C++宣言されていない識別子

#pragma once 
#include"stdafx.h" 
#include"Globals.h" 
#include<vector> 
#include"MCell.h" 

class Ship 
{ 

private: 
    int lenght; 
    int oriantation; 
    vector<Cell*> cells; 
    vector<Cell*> aroundCells; 

...

#pragma once 
#include<vector> 
#include"MShip.h" 

class Cell 
{ 

private: 
    bool haveShip; 
    bool selected; 
    bool around; 
    int x; 
    int y; 
    Ship* ship; 

は、私はそれらのような多くのエラーを持っている:

1>projects\seewar\seewar\mship.h(13): error C2065: 'Cell' : undeclared identifier 
1>projects\seewar\seewar\mship.h(13): error C2059: syntax error : '>' 
1>projects\seewar\seewar\mship.h(14): error C2065: 'Cell' : undeclared identifier 

は、コードで何が悪いのでしょうか?

答えて

3

MCell.hをインクルードすると、MCell.hで定義されているCellを参照するMShip.hがインクルードされます。しかし、MShip.hは、プラグマのために含まれないMCell.hを参照しています。もしプラグマが一度もそこにいなければ、コンパイラのオーバーフローをスタックする無限ループを得るでしょう...

代わりに前方宣言を使うことができます。

つまり、MShip.hから#include "MCell.h"を削除し、単に "class Cell;"に置き換えます。すべての循環参照の問題はこれで解消されます:)

+0

私はあなたの悲しみを行いました。しかし、私は新しいエラーが発生しました:matrix [i] [j] = new Cell(i、j); 1> c:\ users \ ostap \ documents \ visual studio 2010 \ projects \ seewar \ seewar \ mplane.h(32)エラーC2514: 'Cell':クラスにコンストラクタがありません –

+0

Ok ..it works..thanks非常に –

1

ヘッダーファイルはお互いに依存します。しかし一方をもう一方の前に読む必要があります。だから、もう一方に依存しないようにそれらのうちの1つ(または両方)を書き換える必要があります。クラスを定義するヘッダーファイルをインクルードするのではなく、クラスを前方宣言することでこれを行うことができます。

MShip.hでは、MCell.hを含めるのではなく、class Cell;という宣言を入れてください。逆も同様です。

1

クラスを宣言する必要があります。

Ship.h

class Cell; //forward declaration 
class Ship 
{ 
    //.... 
}; 

Cell.h

class Ship; //forward declaration 
class Cell 
{ 
    //.... 
}; 

円形包含を取り除きます。完全な型ではなくポインターで作業しているので、別のヘッダーにヘッダーを1つ含める必要はありません。型の具体的なオブジェクトを使用する場合は、完全なクラス定義が必要です。ポインタの場合、あなたはしません。

関連する問題