Инициализация shared_ptr, когда объект требует конструктор по умолчанию

Для присвоения shared_ptr переменной типа Graph в библиотеке лимонных графов я сделал это:

typedef ListDigraph Graph;
typedef std::shared_ptr<Graph> Process_pointer;
Process_pointer process(new Graph);

Это работало нормально, но теперь мне нужно объявить shared_ptr для объекта карты. Обычно объект карты работает так:

Graph process;
typedef ListDigraph::NodeMap<string> Node_names;
Node_names name(process);

То есть для имени требуется объект Graph для конструктора по умолчанию.

Чтобы объявить shared_ptr для этого, я сделал это:

typedef ListDigraph::NodeMap<string> Node_names;
typedef std::shared_ptr<Node_names> Nname_pointer;
Nname_pointer name = new Node_names;
name(process);

Я знаю, декларация для имени неверна, но как мне назначить ей память, а также инициализировать ее объектом процесса.

0

Решение

использование std::make_shared:

auto p = std::make_shared<Node_names>(process);

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

Обратите внимание, что это рекомендуемый способ создания по умолчанию shared_ptrс управляемыми объектами. Увидеть Почему вы почти всегда должны использовать make_shared для создания объекта, которым владеет shared_ptrs?.

6

Другие решения

Nname_pointer name (new Node_names (process));

Замечание: это не имеет ничего общего с shared_ptr, то же самое было бы с обычным указателем.

3

По вопросам рекламы [email protected]