Передача многомерного массива обратно через члены доступа

У меня есть класс "foo", который имеет многомерный массив и должен предоставить копию массива через член getArray. Есть ли хороший способ сделать это, когда массив создается динамически, поэтому я не могу передать массив обратно как const, поскольку массив всегда удаляется, воссоздается и т. д. Я думал о создании нового динамического массива, чтобы передать его обратно, но это приемлемо, так как вызывающий код должен знать, чтобы удалить это и т. д.


person user174084    schedule 22.02.2010    source источник


Ответы (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;
   }
};
person Community    schedule 22.02.2010

Простой ответ на ваш вопрос: это не очень хороший дизайн, так как это должен быть создающий класс, который должен обрабатывать удаление/освобождение массива.

Главное, почему вы продолжаете удалять/воссоздавать этот многомерный массив? Разве вы не можете создать один экземпляр, а затем просто изменить его, когда это необходимо?

Лично я бы вернул массив как есть, перебирал его и выполнял любые вычисления/функции над ним во время цикла, поэтому экономил ресурсы, не создавая/удаляя массив.

person Michal Ciechan    schedule 22.02.2010

Нил, вероятно, лучший ответ. Вторым лучшим будет не использовать массив. В C++, когда вы говорите о динамическом массиве, это означает vector.

Есть две возможности:

  1. вложенные векторы: std::vector<int, std::vector<int> >(10, std::vector<int>(20))
  2. простой вектор: std::vector<int>(200)

Оба будут иметь 200 элементов. Первый явно многомерный, а второй оставляет вам задачу вычисления смещений.

Второй требует больше работы, но более производительен с точки зрения памяти, поскольку выделяется один большой фрагмент вместо одного маленького фрагмента, указывающего на десять средних...

Но, как сказал Нил, собственный класс для определения точного набора операций лучше :)

person Matthieu M.    schedule 22.02.2010