9

我正在使用 C++ 编写国际象棋游戏。我想为 Board 类创建两个类属性: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并且在解析COLUMNSfor 的定义时尚未声明。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 回答
0

您还可以使用#define比枚举更具 C 风格但性能更高的哪个。这是最快的原因是编译器用ROW实际的计算 (8) 替换了 eg 的每个实例。此外,Java 编译器还将static final-variables 替换为实际的字节码(有时可能会出现问题,请参见此处:https ://www.quora.com/What-is-the-syntax-for-declaring-a-static-最终类变量

在您的示例中,这将是:

#define ROWS 8;
#define COLUMNS 8;
class Board {
public:
  Board(int m[ROWS][COLUMNS]);
private:
  Tile *m_TileMap[ROWS][COLUMNS];
};

但是要注意可见性和地址空间——你不应该在标题中放置像这样的定义,因为这样你就会把它们强加给每个人。

对于标头,这将是首选:假设您有一个头文件(board.h),您在其中指定

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

因此,包括您的 board.h 在内的每个人都可以使用Board::ROWSand Board::COLUMNS。(这是预期行为)请参阅此答案以供参考:https ://bytes.com/topic/c/answers/454265-convert-static-final-java-c#post1738052

另一个值得一提的区别是,这些 makros 与有类型的 相比是无const类型的(例如,具有 int 类型,而定义的值没有)。此外,还有动态常量,但这应该离主题有点太远了 - 在这里进一步阅读:https ://en.wikipedia.org/wiki/Constant_(computer_programming)#Dynamically-valued_constants 还有 C/ 中的定义C++ 可以做的更多,例如见这里:https ://www.quora.com/What-is-are-the-alternative-s-of-define-in-java

另一件事有点前瞻性:Java static final String 的常量字符串 C++ 等价物(第一个答案)

于 2018-06-19T11:18:57.267 回答