У меня есть класс "foo", который имеет многомерный массив и должен предоставить копию массива через член getArray. Есть ли хороший способ сделать это, когда массив создается динамически, поэтому я не могу передать массив обратно как const, поскольку массив всегда удаляется, воссоздается и т. д. Я думал о создании нового динамического массива, чтобы передать его обратно, но это приемлемо, так как вызывающий код должен знать, чтобы удалить это и т. д.
Передача многомерного массива обратно через члены доступа
Ответы (3)
Возвращает объект, а не голый массив. Объект может иметь конструктор копирования, деструктор и т. д., которые будут выполнять копирование, удаление и т. д. для пользователя.
class Matrix {
// handle creation and access to your multidim array
// including copying, deletion etc.
};
class A { // your class
Matrix m; // the classes matrix
Matrix getArray() {
return m;
}
};
Простой ответ на ваш вопрос: это не очень хороший дизайн, так как это должен быть создающий класс, который должен обрабатывать удаление/освобождение массива.
Главное, почему вы продолжаете удалять/воссоздавать этот многомерный массив? Разве вы не можете создать один экземпляр, а затем просто изменить его, когда это необходимо?
Лично я бы вернул массив как есть, перебирал его и выполнял любые вычисления/функции над ним во время цикла, поэтому экономил ресурсы, не создавая/удаляя массив.
Нил, вероятно, лучший ответ. Вторым лучшим будет не использовать массив. В C++, когда вы говорите о динамическом массиве, это означает vector
.
Есть две возможности:
- вложенные векторы:
std::vector<int, std::vector<int> >(10, std::vector<int>(20))
- простой вектор:
std::vector<int>(200)
Оба будут иметь 200
элементов. Первый явно многомерный, а второй оставляет вам задачу вычисления смещений.
Второй требует больше работы, но более производительен с точки зрения памяти, поскольку выделяется один большой фрагмент вместо одного маленького фрагмента, указывающего на десять средних...
Но, как сказал Нил, собственный класс для определения точного набора операций лучше :)