C ++ Java static final等价物

时间:2013-05-17 17:47:55

标签: c++ static const declaration

我正在使用C ++来编写国际象棋游戏。我想为类Board创建两个类属性:ROWS和COLUMNS。在Java中,我会将它们声明为静态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]);
}

6 个答案:

答案 0 :(得分: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];
};

答案 1 :(得分:2)

在声明ROWS和COLUMNS之后声明你的m_TileMap

e.g。

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,需要在之前声明它们。

答案 2 :(得分:1)

尝试使用枚举如下

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

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

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

答案 3 :(得分:1)

解析ROWS的定义时,尚未声明

COLUMNSm_TileMap。只需移动这些定义:

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

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

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

顺便说一句,如果您不需要使用ROWSCOLUMNS的地址,则替代方法是使用enum,如下所示:

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


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

所有这些都被说过,如果你刚刚使用vector,生活会不会那么简单?

答案 4 :(得分:0)

您需要在类定义中说明大小: static const int ROWS = 8; 等

不要忘记;在课程定义之后!

答案 5 :(得分:0)

您还可以使用#define,它比C样式更具有C风格,但性能也比枚举更好。之所以最快,是因为编译器用实际值(8)替换了ROW的每个实例。 此外,Java编译器还将static final变量替换为实际的字节码(有时可能会出现问题,请参见此处:https://www.quora.com/What-is-the-syntax-for-declaring-a-static-final-class-variable

在您的示例中为:

#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::ROWSBoard::COLUMNS。 (这是预期的行为) 请参阅以下答案以供参考:https://bytes.com/topic/c/answers/454265-convert-static-final-java-c#post1738052

另一个值得一提的区别是,与const(已键入(例如,如果定义的值不包含int,则键入int))相比,这些makros未键入。此外,还存在动态常量,但这离主题有点太远了-在这里进一步阅读: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

还有一点希望:常量字符串 C++ equivalent of Java static final String (第一个答案)