Я изо всех сил пытаюсь выяснить, как объявить 2D-массив в качестве глобальной переменной, чтобы я мог использовать его во всех моих методах. До сих пор он объявлялся только в одном методе, поэтому его нельзя использовать в других методах. Я выяснил, как объявить обычный строковый массив, просто набрав строку * array = new string [1] в начале моего кода, прежде чем методы (затем я изменяю размер этого массива на основе переменной), но я не уверен, как это сделать с 2D-массивом:
void WordSearch::ReadSimplePuzzle()
int columns = 9;
int rows = 9;string **simple2DArray = new string*[columns];
for (int i = 0; i < columns; i++)
simple2DArray[i] = new string[rows];
//code that populates the array too long to post but not relevant.
Затем у меня есть метод, где мне нужно получить доступ к simple2DArray, но я не могу понять, как определить его в начале кода, любая помощь будет оценена.
Я изо всех сил пытаюсь выяснить, как объявить 2D-массив в качестве глобального
переменная, поэтому я могу использовать его во всех моих методах.
Как и для любого глобального var, вам нужно объявить ваш указатель в глобальном пространстве:
string **simple2DArray;
и тогда вы можете назначить ему изнутри вашего метода
simple2DArray = new string*[columns];
Если ваши переменные столбцов и строк никогда не меняются, вы можете сделать это:
const int columns = 9;
const int rows = 9;
string simple2DArray[columns][rows];
Статически выделяя память, вам теперь не нужно беспокоиться об ее освобождении.
Поскольку вы пояснили, что размер неизвестен до времени выполнения, вы не сможете распределять память статически. Очень простое решение будет:
std::vector<std::vector<std::string>> simple2DArray; // This will have size 0 at start
Затем на шаге инициализации просто сделайте это:
simple2DArray.resize(rows);
for (auto& row : simple2DArray)
{
row.resize(columns);
}
Конечно, есть и другие способы сделать это, например, выделить всю память в одном блоке строк с размерами * столбцов, а затем выставить ее, как если бы это была двумерная матрица, но это может быть излишним для ваших целей.
Мое предложение — скрыть массив за функциональным интерфейсом.
std::string const& getElement(size_t m, size_t n);
void setElement(size_t m, size_t n, std::string const& val);
Вызывающие функции имеют абстракции 2D-массива, но им не нужно знать, как они представлены в коде.
В реализации у вас есть различные варианты:
std::vector
, Еще нужно сопоставить индексы.std::vector<std::vector<std::string>>
, Не требуется отображение индексов.