C ++唯一指针练习的向量

拉兹万·内奇塔(Razvan Nechita)

首先,这是我的代码:

#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。我哪里错了?

带翅膀的小行星

std::move您要做的不仅仅是编译代码。它实际上具有功能,目的和结果。*

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

因此,这没有任何意义:

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

考虑一下名称中的“独特”一词unique_ptr


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++ 14中初始化唯一指针向量的正确方法

C ++唯一指针:内存泄漏

不可移动的C ++ 17唯一指针

现代c ++中的唯一指针

复制C ++唯一指针的语义

在析构函数中的唯一指针上调用reset的C ++语义

为什么要在c ++中创建指向原始类型的唯一指针?

具有唯一指针的 C++ std::future 正在同步调用

如何使用Visual Studio 2017在C ++中为参数化对象数组使用唯一指针?

C++14 不能调用从唯一指针继承的类的复制构造函数或 operator=

使用RTTI克隆唯一指针的向量

如何返回唯一指针的数组/向量?

如何用唯一指针构造向量

当析构函数是私有的时,我应该如何在 c++11 中使用唯一指针?

如何将字符串(来自n行的文件中的字符串)存储在初始化为唯一指针的动态数组中?C ++

C ++ Treiber Stack和原子下一指针

如何将原始指针的向量转换为唯一指针的向量?

如何将唯一指针从一个向量移动到另一个唯一指针向量?

使用指向<Employee>向量的唯一指针向量

清除指向唯一指针拥有的对象的原始指针的向量

具有唯一指针的右值和移动语义:对象0x7ffee5c7b670错误:未分配正在释放的指针

唯一指针与原始指针

Visual Studio:子类的唯一指针崩溃的向量

唯一指针向量错误,初始化后无法引用

编写将唯一指针推入向量的函数时出错

如何在Visual Studio的dll导出类中使用唯一指针向量

如何更改唯一指针向量的可见性

指向向量和多态性的唯一指针

唯一指针向量:查找元素然后通过指针将元素旋转到向量的前面