Вместо статических многомерных массивов вам, вероятно, следует использовать одномерный массив и рассчитывать индекс умножением. Э.Г.
class Array3D {
size_t m_width, m_height;
std::vector<int> m_data;
public:
Array3D(size_t x, size_t y, size_t z, int init = 0):
m_width(x), m_height(y), m_data(x*y*z, init)
{}
int& operator()(size_t x, size_t y, size_t z) {
return m_data.at(x + y * m_width + z * m_width * m_height);
}
};
// Usage:
Array3D arr(10, 15, 20, 100); // 10x15x20 array initialized with value 100
arr(8, 12, 17) = 3;
std :: vector динамически распределяет хранилище, и это хорошо, потому что пространство стека часто очень ограничено, а трехмерные массивы легко занимают много места. Обтекание его таким классом также делает передачу массива (путем копирования или по ссылке) другим функциям тривиальной, а выполнение любой передачи многомерных статических массивов очень проблематично.
Приведенный выше код является просто примером, и его можно оптимизировать и сделать более полным. Конечно, существуют также реализации этого в различных библиотеках, но я не знаю ни одной.