9

C++ を使用してチェス ゲームをプログラミングしています。クラス Board の 2 つのクラス属性、ROWS と COLUMNS を作成したいと考えています。Java では、それらを static final として宣言すると、すべてが思いどおりに機能します。C++ で同じ宣言を行うにはどうすればよいですか? 他のクラスの「Board::ROWS」と「Board::COLUMNS」でこれらの属性にアクセスする必要があります。

これは、ROWS と COLUMNS が m_TileMap の宣言の範囲内で宣言されていないため、コンパイル エラーをスローしています。#defineステートメントを使用せずにこれを行うための良い方法はありますか?

class Board {
  Tile *m_TileMap[ROWS][COLUMNS];

public:
  static const int ROWS = 8;
  static const int COLUMNS = 8;

  Board(int m[ROWS][COLUMNS]);
}
4

6 に答える 6

5

ROWS と COLUMNS の宣言の後に m_TileMap を宣言します

例えば

class Board {

public:
  static const int ROWS = 8;
  static const int COLUMNS = 8;

  Board(int m[ROWS][COLUMNS]);

private:
  Tile *m_TileMap[ROWS][COLUMNS];
};

これは、C++ では、コンパイラが前方を読み取らないためです。したがって、m_TileMap を宣言するときにコンパイラが理解できるようにするには、事前に宣言する必要がありますROWSCOLUMNS

于 2013-05-17T17:56:00.607 に答える
2

クラス メンバーの順序を変更して、ROWS と COLUMNS が使用される前に宣言されるようにすることができます。

class Board {
public:
  static const int ROWS = 8;
  static const int COLUMNS = 8;

  Board(int m[ROWS][COLUMNS]);

private: 
  Tile *m_TileMap[ROWS][COLUMNS];
};
于 2013-05-17T17:54:43.127 に答える
1

次のように列挙型を使用してみてください

class Board {
public:
    enum {ROWS = 8};
    enum {COLUMNS = 8};

private:
    Tile *m_TileMap[ROWS][COLUMNS];

public:
    Board(int m[ROWS][COLUMNS]);
};
于 2013-05-17T17:57:20.607 に答える
1

ROWSの定義が解析されるCOLUMNSときに、まだ宣言されていません。m_TileMapこれらの定義を移動するだけです。

class Board {
  Tile *m_TileMap[ROWS][COLUMNS];

public:
  static const int ROWS = 8;
  static const int COLUMNS = 8;

  Board(int m[ROWS][COLUMNS]);
};

余談ですが、ROWSorのアドレスを取得する必要がない場合は、次のようCOLUMNSに an を使用することもできます。enum

class Board {
public:
  enum { ROWS = 8, COLUMNS = 8};
  Tile *m_TileMap[ROWS][COLUMNS];


  Board(int m[ROWS][COLUMNS]);
};

以上のことをすべて述べた上で、単に を使用すれば、人生はそれほど単純になると思いませvectorんか?

于 2013-05-17T17:57:57.140 に答える
0

クラス定義でサイズを指定する必要があります。 static const int ROWS = 8; 等

; を忘れないでください。クラス定義の後!

于 2013-05-17T17:57:05.097 に答える