2015-03-01 2 views
3

Я работаю над программой tic tac toe, и мне нужно создать 2D-массив переменной величины в классе. Вот как я это написал прямо сейчас:Как инициализировать 2D-массив переменных размера в классе C++?

class ticTacToe 
{ 
    public: 
     ticTacToe(); 
     void display(); 
     bool moveIsValid(); 
    private: 
     int rows; 
     int cols; 
     int board[rows][col]; 
} 

У меня есть доска считывании из файла в конструкторе, но я не знаю, как это сделать переменного размера, так что я могу читать в совет любой размер, а затем доступ к нему за пределами класса.

+0

Спасибо за помощь!Просто быстрый вопрос, хотя, когда я использую массив вне класса, я просто пишу 'ticTacToe newGame; '' newGame-> board [i] [j]; ' – gcccpp

+0

_do Я просто пишу 'ticTacToe newGame;' _ Да, вы не используете 'new'. –

+0

Поскольку «доска» является частной переменной, вы не можете получить к ней доступ за пределами класса ticTacToe – Quest

ответ

0

Вам необходимо либо иметь динамического размера массиву

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); 
} 
+1

Вы имеете в виду 'vector >' insn't it? – Christophe

+0

@ Кристофе Не обязательно. Они могут использовать один вектор и использовать арифметику строки/столбца. До них. – CoryKramer

+0

Правда, я думаю, что для оригинального плаката было бы проще/лучше работать с одномерным вектором. Найдите его «квадрат» и используйте высоту строк для значений. –

4

«У меня есть доска считывание из файла в конструкторе, но я не знаю, как это сделать переменный размер, так что я могу читать доски любого размера»

в 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; } 

Чем лучше дизайн подход был бы IMHO, чтобы обеспечить что-то вроде отдельной функции для чтения из 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 
} 
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; 

Обновление: Вы можете выполнить одно выделение, но вам будет проще работать с ним таким образом.

Смежные вопросы