【发布时间】: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