dasblinkenlight уже дал неплохой ответ, однако есть второй способ сделать это, что более эффективно. Потому что, если вы делаете (код взят из его ответа)
matrix[i] = new obj[n];
for (int j = 0 ; j != n ; j++) {
matrix[i][j] = obj(arg1, arg2, arg3); // Non-default constructor
}
произойдет следующее:
памяти для n
объектов выделяется.
Все объекты n
по-умолчанию построены.
Для каждого объекта в стек создается пользовательский объект.
Этот объект в стеке копируется в выделенный объект.
Объект в стеке разрушен.
Очевидно, что гораздо больше, чем было бы необходимо (хотя и совершенно правильно).
Вы можете обойти эту проблему с помощью размещения нового синтаксиса:
matrix[i] = (obj*)new char[n*sizeof obj]; //Allocate only memory, do not construct!
for (int j = 0 ; j != n ; j++) {
new (&matrix[i][j]) obj(arg1, arg2, arg3); // Non-default constructor called directly on the object in the matrix.
}
является необходимым использовать второй цикл в вашем фрагменте кода? эта строка 'matrix [i] = new obj [n];' сама выделяет 'n' объекты класса' obj', и делая это 'n' раз, он выделяет полную nxn-матрицу – mangusta
@mangusta. Вы правы, я ошибался число звездочек, считая, что OP имеет матрицу указателей, когда на самом деле он этого не делает. Благодаря! – dasblinkenlight
oh, поэтому для конструктора, отличного от по умолчанию, мы должны создать объект-мудрый?не можем ли мы сделать это в распределении массива, как 'obj() []'? я не слышал об этом, поэтому я прошу только прояснить ситуацию :) – mangusta