我正在研究一个tic tac toe程序,我需要在一个类中创建一个可变大小的2D数组。这就是我现在写的方式:
class ticTacToe
{
public:
ticTacToe();
void display();
bool moveIsValid();
private:
int rows;
int cols;
int board[rows][col];
}
我从构造函数中的文件中读取了板,但我不知道如何使它变为可变大小,以便我可以在任何大小的板中读取,然后在类之外访问它。
答案 0 :(得分:4)
&#34;我从构造函数中的文件读入了电路板,但我不知道如何使它变为可变大小,以便我可以在任何大小的电路板中读取&#34; < / em>的
在c ++中,您使用std::vector
代替原始数组,如下所示
class ticTacToe {
public:
ticTacToe();
void display();
bool moveIsValid();
private:
int rows;
int cols;
std::vector<std::vector<int>> board; // <<<<
};
动态分配可以在构造函数中应用如下:
ticTacToe(int rows_, int cols_) : rows(rows_), cols(cols_) {
board.resize(rows,std::vector<int>(cols));
}
然后在课程
之外访问它
嗯,我不确定这是不是一个好主意,但你可以简单地为该成员变量添加一个访问函数
std::vector<std::vector<int>>& accBoard() { return board; }
更好的设计方法是恕我直言,提供类似于从std::istream
读取的单独功能:
void ticTacToe::readFromStream(std::istream& is) {
// supposed the first two numbers in the file contain rows and cols
is >> rows >> cols;
board.resize(rows,std::vector<int>(cols));
for(int r = 0; r < rows; ++r) {
for(int c = 0; c < cols; ++c) {
cin >> board[r][c];
}
}
}
对于实际代码,您可以检查输入错误,例如
if(!(is >> rows >> cols)) {
// handle errors from input
}
答案 1 :(得分:3)
如果这是家庭作业,你不能使用标准库:
// Declaration
int rows;
int columns;
int **board;
// Construction
board = new int*[rows];
for (int i = 0; i < rows; i++) {
board[i] = new int[columns];
}
// Destruction
for (int i = 0; i < rows; i++) {
delete[] board[i];
}
delete[] board;
更新:您可以执行单个分配,但您可以更轻松地以这种方式工作。
答案 2 :(得分:1)
您需要拥有动态大小的数组
int* board;
然后你的构造函数将是
ticTacToe::ticTacToe(int _rows, int _cols)
: rows{_rows}, cols{_cols}
{
board = new int[rows * cols];
}
你的析构函数
ticTacToe::~ticTacToe()
{
delete[] board;
}
或者更好的是使用std::vector
std::vector<int> board;
然后你的构造函数将是
ticTacToe::ticTacToe(int _rows, int _cols)
: rows{_rows}, cols{_cols}
{
board.resize(_rows * _cols);
}
答案 3 :(得分:0)
我建议您使用指针指向指针。
#include <iostream>
#include <cstdlib>
using namespace std;
class ticTacToe{
private:
int rows;
int cols;
int **board; // POINTER TO POINTER
public:
ticTacToe(int a,int b){
rows=a;
cols=b;
board=new int*[rows];
for (int k = 0; k < rows; ++k) {
board[k]=new int[cols];
}
/*LET'S INITIALIZE CELL VALUES TO= 0*/
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
board[i][j]=0;
}
}
}
void display();
bool moveIsValid();
};