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]。 因此,指针 1 指向的资源不再有效,然后再次在 if 循环中使用相同的资源进行设置。所以那将只是一个空的,只有我猜。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 加速C++练习2.4
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- C++ 独特指针练习的向量
- C++向量练习未声明的变量
- TC++PL书中练习中向量ctor的定位错误
- 练习:用 C/C++ 中的整数填充向量