Простой класс для создания, как вы его называете, 2D массива , будет выглядеть примерно так:
template <class T> 2DArray {
private:
T *m_data;
int m_stride;
public:
2DArray(int dimY, int dimX) : m_stride(dimX) : m_data(new[] T[dimX * dimY]) {}
~2DArray() { delete[] m_data; }
T* operator[](int row) { return m_data + m_stride * row; }
}
Можно использовать это как:
2DArray<int> myArray(30,20);
for (int i = 0; i < 30; i++)
for (int j = 0; j < 20; j++)
myArray[i][j] = i + j;
Или даже передать &myArray[0][0]
в качестве адреса низкоуровневым функциям, которые принимают некие «плоские буферы».
Но, как вы видите, это превращает наивные ожидания в то, что это myarray[y][x]
.
Как правило, если вы взаимодействуете с кодом, который требует какого-то классического плоского массива в стиле C, то почему бы просто не использовать это?
Редактировать: Как уже говорилось, выше просто .Никаких попыток проверки границ вообще.Прямо как «массив».