我正在使用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]);
}
答案 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时编译器能够理解ROWS
和COLUMNS
,需要在之前声明它们。
答案 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
的定义时,尚未声明 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]);
};
顺便说一句,如果您不需要使用ROWS
或COLUMNS
的地址,则替代方法是使用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::ROWS
和Board::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 (第一个答案)