Для присвоения 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);
Я знаю, декларация для имени неверна, но как мне назначить ей память, а также инициализировать ее объектом процесса.
использование std::make_shared
:
auto p = std::make_shared<Node_names>(process);
Это работает для типов с конструкторами с произвольным числом параметров.
Обратите внимание, что это рекомендуемый способ создания по умолчанию shared_ptr
с управляемыми объектами. Увидеть Почему вы почти всегда должны использовать make_shared для создания объекта, которым владеет shared_ptrs?.
Nname_pointer name (new Node_names (process));
Замечание: это не имеет ничего общего с shared_ptr, то же самое было бы с обычным указателем.