3

海戦ゲームを作りたい。Ship と Cell の 2 つのクラスがあります。

#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

コードの何が問題になっていますか?

4

3 に答える 3

5

問題は、MCell.h をインクルードするときに、MCell.h で定義されたセルを参照する MShip.h をインクルードすることです。ただし、MShip.h は、pragma once のために含まれない MCell.h を参照します。プラグマがかつてそこになかった場合、コンパイラのスタックオーバーフローになる無限ループが発生します...

代わりに、前方宣言を使用できます。

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

于 2012-02-24T22:56:32.173 に答える
1

ヘッダー ファイルは相互に依存しています。ただし、どちらかを先に読む必要があります。そのため、一方 (または両方) を他方に依存しないように書き直す必要があります。クラスを定義するヘッダー ファイルを含める代わりに、クラスを前方宣言することで、これを行うことができます。

したがって、MShip.h では、MCell.h をインクルードする代わりに宣言を配置する必要があり、class Cell;その逆も同様です。

于 2012-02-24T22:55:56.203 に答える
1

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

Ship.h

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

Cell.h

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

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

于 2012-02-24T22:55:59.770 に答える