2016-05-07 6 views
1

わかりましたので、基本的に次のように私は、ボード上の部分の構造体を持っている:C++円形構造体

struct piece 
{ 
    int value; 
    bool revealed; 
    bool canMove(int x, int y) 
    { 
     //This is where the problem is. 
     if (board[x][y].value == 13) //If it's not occupied 
      return true; 
     else 
      return false; 
    } 
}; 

//Define the board 
piece board[x][y]; 

をそして、それは私に、このような「ボード」などのエラーが与えている:宣言されていない識別子を。 これを修正するにはどうすればよいですか?私は構造体の前にボード宣言を置こうとしましたが、その部分が宣言されていない識別子であるとだけ言います。

私はパラメータとしてボードに通すことができたことを知っていますが、私はいくつかの機能を持っています。それは私が望むよりも多くの時間を要するので、他の解決方法があれば教えてください!

この質問はQuestion

答えて

2

あなたは、コンパイラは常にあなたが何を言ってるのか知っているように、そのメンバ関数の実装からクラス定義を分離する必要があります。

struct piece 
{ 
    int value; 
    bool revealed; 
    bool canMove(int x, int y); // this is sufficient for the moment 
}; 

piece board[x][y]; // now, compiler knows what a piece is. 

bool piece::canMove(int x, int y) 
{     // now board is known as well 
    if (board[x][y].value == 13) 
     return true; 
    else 
     return false; 
} 
+0

ありがとう!それは完全に動作します!私はそれについても考えていなかった! –

1

に関連する(同一ではない)されて、あなたがboardを宣言した後、その後の外にそれを定義し、クラス内canMoveを宣言します。その時点で、boardを正常に参照できます。

+0

これはクラスではなく構造体です。 – vesperto

+1

クラスは、キーワード 'struct'またはキーワード' class'を使用して宣言できます。唯一の違いはデフォルトのアクセスです。 http://en.cppreference.com/w/cpp/language/classes –

+0

これはまだ構造体です。 – vesperto

1

あなたが作品と作品を混合しています。これは本当に間違ったデザインです。

あなたのメソッドcanMoveは単一の要素に属します。もちろん

board[x][y].canMove() 

をあなたはその振る舞いをカプセル化する新しいクラス会をクレアーレことができます。ちょうど行う - あなたが作品の2D配列から手に入れたいものを手に入れるために

bool canMove() const 
{ 
    return value == 13; 
} 

:だから、その定義は、この事実をrdflect必要があります、2つの引数を持つcanMoveメソッドのように。

+0

さて、canMove関数は、メンバー構造体の配列内の値に応じてブール値を返します。ボード上の位置と問題のピースを取り囲むピースはすべて、ピースが移動できるかどうかを定義するために一緒になります。私は関数を単純化して理解しやすくしました。 –

+0

私は既にプログラム全体を作成していて、問題は比較的小さいので、前の答えのようにデカップリングすることができたら、500行のコードを編集しないでください。 –

+0

プロジェクトが開発後の段階にある場合(もちろん、変更する必要はありません)しかし、それが維持されれば、新しい機能が追加され、この "デザインの匂い"はあなたにますますコストをかけることになります。そのような場合には、これを変更することが最良の選択肢になります。 – PiotrNycz