代码之家  ›  专栏  ›  技术社区  ›  sdasdadas

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

  •  0
  • sdasdadas  · 技术社区  · 6 年前

    我有一个关于创建对象的问题,将它们添加到容器类中,并使它们超出C++的作用域。

    例如,我的 主CPP

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

    以及 容器H

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

    项目h

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

    这个问题稍后在我的主班 容器 在for循环内创建的已超出范围。如果我将add_item更改为pass-by值,它会给我带来唯一的_ptr和复制构造函数的问题。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Slava    6 年前

    如果我将add_item更改为pass-by值,它会给我带来唯一的_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() );
    }
    
        2
  •  1
  •   Michael    6 年前

    有几种方法可以解决这个问题。这基本上是传递XValues的确切用例。传递值将导致项的所有成员的副本。如果有成员可能在堆上分配了大量数据,例如std::vector,您将希望通过移动成员来避免这种复制和分配。

    简单的答案是通过Scott Meyers所说的“通用参考”。

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