Передача многомерного массива обратно через члены доступа - PullRequest
1 голос
/ 22 февраля 2010

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

Ответы [ 3 ]

3 голосов
/ 22 февраля 2010

Возвращает объект, а не голый массив. Объект может иметь конструктор копирования, деструктор и т. Д., Который будет выполнять копирование, удаление и т. Д. Для пользователя.

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;
   }
};
0 голосов
/ 22 февраля 2010

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

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

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

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

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

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

0 голосов
/ 22 февраля 2010

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

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

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

...