在矢量的尖括号内使用指针符号与在外部使用指针符号有什么区别
What is the difference between using a pointer symbol inside the angle brackets of a vector vs using them outside
这不是我遇到的问题,而只是我只是想了解一些东西。
像这样使用*有什么区别
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
类型对象的向量的指针。
至于错误消息,当您有一个对象时,您可以使用.
来访问其成员;当您有一个指向对象的指针时,您可以使用->
来访问它指向的对象的成员。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 为函数定义符号不明确的指针参数
- 在函数中返回无符号字符数组,但不返回指针
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- 在函数内初始化无符号字符指针将返回空指针
- 函数指针给我"重新声明为不同类型的符号"错误
- 使用指针选择长无符号变量中的数字
- 是否可以将无符号字符数组reinterpret_cast到仅包含C++中无符号字符成员的结构指针
- 为什么C++让你把"->"符号放在指针上,把"."符号放在其他所有东西上?
- 这个星号 (*) 符号在 C++ 中是什么意思?-- 指向成员的指针
- 指针符号在参数规范中表示什么,例如:(char16 *缓冲区,int32 大小)?C++
- 传递函数指针时未解析的外部符号
- 指向符号的指针与常规符号查找的 ABI 稳定性
- 指针是否被视为C++中的无符号值?
- 尝试将返回无符号值的函数分配给指向无符号的指针时,继续获取 SIGSEGV
- 在矢量的尖括号内使用指针符号与在外部使用指针符号有什么区别
- 指针符号和数组