Объект выходит за рамки / передача права собственности - PullRequest
0 голосов
/ 25 сентября 2018

У меня проблема с созданием объектов, добавлением их в класс контейнера и выводом их из области видимости в C ++.

Например, мой main.cpp

Container container;
for (unsigned int i = 0; i < 10; i++) {
    Item item;
    container.add_item(item);
}

и интерфейс container.h

struct Container {
    std::vector<std::reference_wrapper<Item>> items;
    void add_item(Item& item); // Push back of items vector.
};

и item.h

struct Item {
    std::unique_ptr<AnotherThing> unrelated_thing;
};

Проблемапозже в моем основном классе Контейнеры , созданные внутри цикла for, вышли из области видимости.Если я изменяю add_item для передачи по значению, это вызывает у меня проблемы с unique_ptr и конструктором копирования.

Есть ли какой-то идиоматический способ создания объектов внутри области действия и «передачи» их в другой класс?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Есть несколько способов справиться с этим.Это в основном точный вариант использования для передачи значений xvalue.Передача по значению приведет к копированию всех элементов элемента.Если есть члены, которые могут иметь большие объемы данных, выделенные в куче, такие как std :: vector, вы захотите избежать этого копирования и распределения, перемещая ваши члены.

Простой ответ - передатьто, что Скотт Мейерс называет «Универсальным справочником»

void Container::add_item( Item&& item) {
    items.push_back( std::move(item))
}
0 голосов
/ 25 сентября 2018

Если я изменю add_item для передачи по значению, это вызывает у меня проблемы с unique_ptr и конструктором копирования.

Ваш вектор должен содержать объекты по значению:

std::vector<Item> items;

тогда вам нужно переместить ваш объект в вектор при передаче по значению:

void Container::add_item( Item item )
{
     items.push_back( std::move( item ) );
}

, а затем вам также нужно переместить ваш объект в цикле:

for (unsigned int i = 0; i < 10; i++) {
    Item item;
    container.add_item( std::move(item) );
}

илиВы можете просто передать временное:

for (unsigned int i = 0; i < 10; i++) {
    container.add_item( Item() );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...