在矢量的尖括号内使用指针符号与在外部使用指针符号有什么区别

What is the difference between using a pointer symbol inside the angle brackets of a vector vs using them outside

本文关键字:指针 符号 外部 什么 区别      更新时间:2023-10-16

这不是我遇到的问题,而只是我只是想了解一些东西。

像这样使用*有什么区别

vector<Emp*> empList;

与这样使用它

vector<Emp>* empList;

在我正在从事的一个项目中,当我尝试这样做时,它会给我一个错误

vector<Emp>* empList;
empList->push_back(new empChild("Kyle"));

但是当我更改它时,它起作用了

vector<Emp*> empList;
empList.push_back(new EmpChild("Kyle"));

我不明白为什么。

Emp 是父类EmpChild是Emp的派生类

vector<Emp*> empList;

是一个包含指向Emp的指针的向量(这是使用继承时所需的(。

vector<Emp>* empList;

是指向包含 Emp 的向量的指针(导致对象切片,您不希望在继承中这样做(。

编辑

正如评论中指出的,您可能应该考虑使用std::unique_ptr而不是原始指针。它们的优点是它们会为您管理对象(这意味着它们将为您删除它,从而避免潜在的内存泄漏(。所以你应该使用

vector<unique_ptr<Emp>> empList;

而不是

vector<Emp*> empList;

但是,您现在必须使用 vector::emplace_back 而不是 vector::push_back

empList.emplace_back(new EmpChild("Kyle"));

(这与std::unique_ptr的工作方式有关(

这里

vector<Emp*> empList;

empList 是存储 Emp 指针的向量类型的对象,实例是在堆栈上创建的,并隐式实例化和为您分配。

vector<Emp>* empList;

您正在声明 empList 作为矢量类型的指针。 你可以让第二个工作,但你需要显式分配和实例化它,即你需要调用

vector<Emp>* empList = new vector<Emp>(); <--- something like this to instantiate
empList->push_back(...);
....
....
// need to clean up after not longer use
delete empList;

*类型名称的一部分。始终查看*适用的类型。 Emp*的意思是"指向 Emp",所以vector<Emp*>的意思是"指向 Emp 的向量",即包含指针的向量。 vector<Emp>*的意思是"指向 Emp 向量的指针",因此它是指向包含 Emp 类型对象的向量的指针。

至于错误消息,当您有一个对象时,您可以使用.来访问其成员;当您有一个指向对象的指针时,您可以使用->来访问它指向的对象的成员。