【问题标题】:C++ Vector of unique pointers practiceC++向量的唯一指针实践
【发布时间】:2020-05-29 06:14:33
【问题描述】:

首先,这是我的代码:

#include <iostream>
#include <memory>
#include <vector>

class Animal 
{

public:

    virtual void display() =  0;

};

class Dog : public Animal 
{
    std::string name;

public:

    Dog(std::string n) : name(n) {}

    void display() override
    {
        std::cout << "I'm a dog and my name is: " << name << std::endl;
    }

};


class Cat : public Animal 
{
    std::string name;

public:

    Cat() {}
    Cat(std::string n) : name(n) {}

    void display() override
    {
        std::cout << "I'm a cat and my name is: " << name << std::endl;
    }

};


int main()
{
    Dog D1("Spike");
    Dog D2("Razor");
    Cat C1("Cat");

    std::vector<std::unique_ptr<Animal>> vectorOfAnimals;

    std::unique_ptr<Animal> pointer1 = std::make_unique<Dog>(D1);
    std::unique_ptr<Animal> pointer2 = std::make_unique<Dog>(D2);
    std::unique_ptr<Animal> pointer3 = std::make_unique<Cat>(C1);
    std::unique_ptr<Animal> pointer4 (nullptr);

    vectorOfAnimals.push_back(std::move(pointer1));
    vectorOfAnimals.push_back(std::move(pointer2));
    vectorOfAnimals.push_back(std::move(pointer3));
    vectorOfAnimals.push_back(std::move(pointer4));

    for(auto& animals : vectorOfAnimals)
    {
        animals = nullptr;
    }

    if(!vectorOfAnimals[0])
    {
        std::cout << "First element is nullptr!" << std::endl;
        vectorOfAnimals[0] = std::move(pointer1);
    }

    for(auto& animals : vectorOfAnimals)
    {
        if(!animals)
        {
            std::cout << "This is a nullptr!" << std::endl;
        }
        else
        {
            animals->display();
        }
    }

    return 0;
}

我创建了一个包含 2 个派生类的抽象类。然后,在指向基类的唯一指针向量中推送一些唯一指针。然后,出于学习目的,我分配给向量 nullptr 的所有元素,并尝试将创建的名为“pointer1”的第一个指针的所有权转移给向量的第一个元素,但它不起作用,第一个元素仍然是 nullptr。我哪里错了?

【问题讨论】:

  • 为什么你认为你可以移动一些东西,然后用剩下的存根再次移动?把搬家想象成真正的行动,你只搬出一次房子。 (好吧,除非你搬回去,但类比仍然成立)
  • 真正唯一的不是任何指针,而是底层对象,因为每个对象总是只有一个所有者。 (“uniquely_owned”将是一个比“unique_ptr”更具描述性的名称。)如果您将对象移交(“移动”)给其他所有者,则原始所有者不再拥有该对象。
  • 代码运行正常,与编程完全一致。我可以说,它的格式也很好。

标签: c++ c++11 vector c++14 unique-ptr


【解决方案1】:

std::move 不只是为了让你的代码编译。它实际上有一个功能、一个目的、一个结果。*

结果是您的数据已被移走。它消失了。它现在在容器中; pointer1 等与向量中的指针保持未连接,并且(更重要的是)不再指向任何东西。

因此,这是没有意义的:

vectorOfAnimals[0] = std::move(pointer1);

想想名字unique_ptr中的“独特”一词。


* std::move 本身实际上并没有移动任何东西。但是,就我们今天的目的而言,已经足够接近了。

【讨论】:

    【解决方案2】:

    Pointer1 的所有权已经转移到vector[0]。因此pointer1指向的资源不再有效,然后在if循环中再次设置相同的值。所以我猜这将是一个空值。

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 2021-03-31
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多