Russian Qt Forum

Qt => Общие вопросы => Тема начата: myr от Сентября 04, 2009, 16:12



Название: Как вернуть QMap из функции?
Отправлено: myr от Сентября 04, 2009, 16:12
Нужно создавать указатель на него?
В с массивы не возращают или он не массив?
Спасибо.


Название: Re: Как вернуть QMap из функции?
Отправлено: Rcus от Сентября 04, 2009, 16:35
Это просто объект с семантикой значения, а потому может нормально возвращаться из функции по значению.


Название: Re: Как вернуть QMap из функции?
Отправлено: Igors от Сентября 04, 2009, 18:25
Здравствуйте
Нужно создавать указатель на него?
В с массивы не возращают или он не массив?
Тут у них хитро. Пример попроще

Код:
QString a("Test");
QString b = a;
Они держат 1 копию данных (в данном случае "Test") и счетчик объектов которые эти данные используют. Копирование сводится к увеличению этого счетчика. Когда вызовется деструктор "a" счетчик уменьшится на 1. Если Вы попытаетесь изменить "a" - для него будут созданы новые данные а счетчик на старые уменьшится. Когда счетчик обнулится вызывается delete для данных. Поэтому они интенсивно передают и возвращают объекты/контейнеры по значению. С непривычки такой подход "бьет по ушам"  :)

Несмотря на все эту крутизну с "shallow copy" я бы лично наглеть не стал и по значению бы не возвращал. А написал бы скромно и надежно

Код:
typedef QMap<QString, int> TMap;

void FillMap( TMap & map )
{
  ....
}

...

TMap map;
FillMap(map);


Название: Re: Как вернуть QMap из функции?
Отправлено: Rcus от Сентября 04, 2009, 18:44
Ну не совсем так. Оптимизация возвращаемого значения (RVO) - стандарт современных компиляторов: при совмещении определения и инициализации объекта возвращаемым значением копирование объекта не происходит /** \see enwi Return value optimization */


Название: Re: Как вернуть QMap из функции?
Отправлено: myr от Сентября 07, 2009, 08:55
Спасибо.
Собираю я в МСВС, пойду по пути Igors.