Объявление массива 2D-символов в классе с другими целочисленными переменными-членами в качестве размера в c ++ - PullRequest
0 голосов
/ 02 августа 2020

Класс, который я использую, показан ниже. Я анализирую данные из txt файла и сохраняю их numRows и numCols, и я хочу, чтобы лабиринт массива 2D char имел размер тех измерений, которые я только что проанализировал. Как я могу это сделать? Я учусь в колледже, и задание программы требует, чтобы numRows, numCols и массив 2D char были частными членами класса Board.

class Board
{
public:
    Board()
    {
        for (int i = 0; i < numRows; i++)
        {
            for (int j = 0; j < numCols; j++)
            {
                maze[i][j] = emptyPos;
            }
        }
    }
    Player getPlayer() { return User; }
    void parseMazeData(int &rowStartPos, int &colStartPos);
private:
    int numRows;
    int numCols;
    char maze[numRows][numCols];
    Player User;
};

1 Ответ

0 голосов
/ 02 августа 2020

Я полагаю, вы не знаете заранее количество строк и столбцов, поэтому вам нужно выполнить динамическое выделение c. Если мое предположение верно, вам нужно уже проанализировать данные лабиринта, прежде чем что-либо делать с массивом.

Итак, как только вы проанализируете эти измерения, вы можете сделать:

Board() {
//Parse maze data somehow before and then:
 maze = new char[nrows*ncols]
 for (int i = 0; i < numRows; i++) { 
   for (int j = 0; j < numCols; j++) { 
     maze[i][j] = emptyPos;
  }
 } 
}

Это, конечно потребует, чтобы вы очистили этот массив лабиринта в деструкторе этого класса Board.

Намного более приятным решением было бы использование std :: vector, поскольку он обеспечивает очистку для вас. Думайте об этом как о массиве высокого уровня с дополнительными функциями и более безопасным API. Таким образом, лабиринт будет объявлен как:

std::vector<std::vector<char>> maze.

При этом вам не нужно будет писать деструктор самостоятельно, и ваш конструктор будет иметь вид:

Board() {
//Parse maze data somehow before and then:
 maze.size(numRows);
 for (int i = 0; i < numRows; i++) { 
    maze.at(i).size(numCols);
    for (int j = 0; j < numCols; j++) { 
       maze[i][j] = emptyPos;
    }
  } 
}

...