Некоторые ответы здесь говорят, что двумерный массив - это массив указателей на другие массивы. Это не так (где хранить указатели, если все, что вы выделяете - это данные массива !?). Вместо этого двумерный массив - это массив других массивов. Таким образом, вам придется изменить тип вашего члена:
FooBar::FooBar()
: _array( new int[10][10] )
{ }
int (*_array)[10];
Это потому, что new[]
возвращает указатель на первый элемент созданного массива. Этот элемент представляет собой массив из 10 целых чисел, и, следовательно, тип элемента изменяется. Если синтаксис вас пугает, упростите его с помощью шаблона (этот шаблон эквивалентен boost::identity
).
template<typename T> struct identity { typedef T type; };
FooBar::FooBar()
: _array( new int[10][10] )
{ }
identity<int[10]>::type *_array;
Это эффективно работает как typedef на месте. Конечно, как и при любом использовании new[]
, для него необходим правильный delete[]
, помещенный в деструктор и вызываемый при разрушении вашего объекта.
Поскольку new[]
выделяет массив элементов, типы которых известны во время компиляции, вы можете установить только первое (самое внешнее) измерение в значение времени выполнения - все остальные должны иметь значения, известные во время компиляции. Если это не то, что вы хотите, вам придется выделить массив указателей, как говорят некоторые другие ответы.
Но обратите внимание, чтобы избежать дальнейшей путаницы, это , а не многомерных массивов. Это одномерные массивы указателей, которые указывают на другие одномерные массивы.