c ++ ссылки на кучу объектов? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть следующий бит кода:

map<int,int>& myMap = new map<int,int>();

, но я получаю следующую ошибку компилятора:

no suitable constructor exists to convert from "std::map<int,int, std::less<int>, std::allocator<std::pair<const int, int>>>*" to "std::map<int,int, std::less<int>, std::allocator<std::pair<const int, int>>>".

Означает ли это, что я должен сделать:

map<int,int>& myMap = *new map<int,int>();

Я думал, что объекты могут передаваться по ссылкам без разыменования в первую очередь (в отличие от указателей)?Также я знаю, что умные указатели существуют, но я не пытаюсь использовать их пока.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я думал, что объекты могут передаваться по ссылкам без разыменования в первую очередь (в отличие от указателей)?

Да, объекты можно передавать, но что у вас здесь:

map<int,int>& myMap = new map<int,int>();

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

map<int,int> myMap;

, и он должен работать нормально.

Чтобы прояснить ситуацию, вы смешали разные понятия, скажем, у нас есть функция, которая принимает переменную sometype по ссылке:

void func( sometype &ref ) { ... }

это не означает, что вы должны объявить переменную как ссылку, чтобы передать ее туда, вы можете передать автоматический объект:

 sometype auto_object;
 func( auto_object );

или передать динамически выделенный объект:

 sometype *ptr_to_object = new sometype;
 func( *ptr_to_object );
 delete ptr_to_object; // or better use smart pointer

и если вам не нужен этот объект, чтобы пережить область, в которой вы его используете, предпочтительнее использовать первый вариант.

0 голосов
/ 06 июня 2018

Вы можете использовать

map<int,int>& myMap = *new map<int,int>();

, но я не рекомендую это.

Динамически распределенная память должна быть освобождена.В то же время вам нужно будет использовать что-то вроде

delete &myMap;

Это код низкого качества, ИМО.

Используйте умный указатель , если вам нужнодинамически распределяемая память.

std::shared_ptr<map<int,int>> ptr = new map<int,int>();

Если вам нужно использовать ссылку, вы можете использовать:

map<int,int>& myMap = *ptr;

Будет лучше, если вы вообще сможете избежать динамически распределяемого объекта и использовать автоматический объект(объект в памяти стека).

map<int,int> myMap;

Обновление в ответ на комментарий ОП

В комментарии вы сказали

Да, я хочусохраняйте эту ссылку, потому что я передаю ее рекурсивной функции

C ++ способ справиться с этим - передать объект по ссылке.

void recursive_foo(std::map<int, int>& myMap)
{
}

void foo_user()
{
   std::map<int, int> myMap;
   // Fill up myMap
   // ...

   recursive_foo(myMap);
}

Если рекурсивная функция неизменив объект, вы можете следовать идиоме, используемой стандартной библиотекой, и использовать вместо этого итераторы.

void recursive_foo(std::map<int, int>::iterator start,
                   std::map<int, int>::iterator end)
{
}

void foo_user()
{
   std::map<int, int> myMap;
   // Fill up myMap
   // ...

   recursive_foo(myMap.begin(), myMap.end());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...