首先,我对OOP很新,所以请耐心等待......
我目前正在尝试用c ++创建一个Tic-Tac Toe终端游戏,为此,我尝试使用私有int _size
来创建一个名为{{1的2d阵列但是我发现了一个错误,我不太明白。我确实在构造函数上将值设置为char _board[_size][_size]
。
无效使用非静态数据成员' Board :: _ size'
Board.h:
_size
那么,我该如何解决这个错误,或者你如何建议我解决这个问题?
答案 0 :(得分:1)
如果您不知道电路板在编译时的大小,您应该使用动态容器来包含电路板数据。 99%的时间,这将是std::vector
。
class Board
{
public:
Board(size_t size); // better to use size_t than int for container sizes
void print();
size_t width() { return _board.size(); }
private:
std::vector<std::vector<char>> _board;
};
// This is not completely intuitive: to set up the board, we fill it with *s* rows (vectors) each made of *s* hyphens
Board::Board(size_t size) :
_board(size, std::vector<char>(size, '-'))
{}
您可以(并且应该!)使用基于范围的循环来显示输出。这将适用于矢量或内置数组。在类主体外定义模板化类的函数使用以下语法:
void Board::print() { // Board::printBoard is a bit redundant, don't you think? ;)
for (const auto &row : _board) { // for every row on the board,
for (const auto &square : row) { // for every square in the row,
std::cout << square << " "; // print that square and a space
}
std::cout << std::endl; // at the end of each row, print a newline
}
}
答案 1 :(得分:-2)
您需要动态分配动态大小的内存,但不要忘记在析构函数中删除它并考虑重载赋值运算符和复制构造函数(请参阅rule of three):
#ifndef BOARD_H
#define BOARD_H
class Board
{
public:
Board(int size){
_size = size;
_board = new char*[size];
for(int i =0; i < size; i++)
_board[i] = new char[size];
}
~Board(){
for(int i =0; i < _size; i++)
delete[] _board[i];
delete[] _board;
}
Board(const Board &other){
//deep or shallow copy?
}
operator=(const Board& other){
//copy or move?
}
void printBoard();
private:
int _size;
char **_board;
};
#endif // BOARD_H
但是如果您不必使用原始内存,请考虑使用向量向量,它将为您处理内存管理:
class Board
{
public:
Board(int size);
void printBoard();
private:
int _size;
std::vector<std::vector<char> > _board;
};