c++ - 对象超出范围/转移所有权

标签 c++ scope

我在创建对象、将它们添加到容器类以及让它们超出 C++ 范围时遇到问题。

举个例子,我的ma​​in.cpp

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

以及container.h的接口(interface)

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 和复制构造函数的问题。

是否有一些惯用的方法可以在范围内创建对象并将它们“转移”到另一个类?

最佳答案

If I change add_item to pass by value, it gives me issues with the unique_ptr and copy constructor.

你的 vector 需要按值保存对象:

std::vector<Item> items;

然后你需要在按值传递时将你的对象移动到 vector 中:

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() );
}

关于c++ - 对象超出范围/转移所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52503576/

相关文章:

c++ - C++ 新手,帮助我入门

javascript - Node.js 中的仅限模块范围

python - 访问lru_cache的缓存

c++ - 将 NT 文件时间转换为 Win32 时间

c++ - 使用 C++,在制作控制台应用程序时,cin 是否有办法接受输入的下一个字符并继续而不按回车键?

c++ - 梯度生成产生奇怪的伪像

javascript - 为什么我在 javascript 中自制的 isset 函数不能完全工作?

javascript - 我对 for 循环中的 javascript let 和 var 感到困惑?

java - 最终改变的属性

当索引超过其长度时,C++ for 循环会自动为 char * 安全终止