簡體   English   中英

C++ 向量的唯一指針實踐

[英]C++ Vector of unique pointers practice

首先,這是我的代碼:

#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本身實際上並沒有移動任何東西。 但是,就我們今天的目的而言,已經足夠接近了。

指針 1 的所有權已轉移到向量 [0]。 因此,pointer1 指向的資源不再有效,然后在 if 循環內部再次設置相同的資源。 所以只有我猜這將是一個空值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM