2016-12-30 2 views
-2

Я хочу создать собственный список, основанный на умных указателях. Я хочу функцию, которую я могу добавить в свой список, но я не знаю, как изменить значение переменной next в объекте, переданном функции, чтобы указать на вновь созданный объект. У кого-то есть идея?Как изменить индикацию умного указателя

#include <iostream> 
#include <memory> 

struct node 
{ 
    int value; 
    std::unique_ptr<node> next; 

    node() { 
     value = 0; 
     next = nullptr; 
    } 
}; 

void add(std::unique_ptr<node> &w, int liczba) 
{ 
    std::unique_ptr<node> new_list_node{ new node }; 
} 

int main() 
{ 
    std::unique_ptr<node> list_node{ new node }; 
    add(list_node, 1); 
    return 0; 
} 

ответ

1

Просто назначьте

void add(std::unique_ptr<node> &w, int liczba) 
{ 
    std::unique_ptr<node> new_list_node{ new node }; 
    w->next = std::move(new_list_node); 
} 

Или еще лучше, для C++ 14

void add(std::unique_ptr<node> &w, int liczba) 
{ 
    w->next = std::make_unique<node>(); 
} 

Вы просто должны убедиться, что вы либо назначить RValue для next или бросить lvlaue в rvalue с std::move

+0

Как бы он каждый раз пропускал хвост функции 'add', если только один уникальный ptr может указывать на объект? –

+0

@PetarVelev - Как он уже делает, передавая ** ссылку ** на 'std :: unique_ptr'. – StoryTeller

+0

, но он должен следить за хвостом, чтобы передать эту ссылку. И если он не может создать другой 'unique_ptr' для хвоста, потому что второй последний элемент уже обладает уникальной собственностью объекта? –

Смежные вопросы