C ++如何使用类类型指针创建向量

时间:2017-09-18 07:10:09

标签: c++ pointers inheritance polymorphism

所以基本上我想制作一个名为

的矢量
  vector <Employee> *EmployeeDB;
  Employee *temp;

我想把它放在

里面
  temp = new Manager(first, last, salary, meetings, vacations);
  EmployeeDB->push_back(*temp);

哦我正在使用继承和多态,这就是为什么new是Manager类型。

P.S我忘了,父类是Employee,它有3个继承父类的子类。 3个子类是经理,研究员和工程师类。

2 个答案:

答案 0 :(得分:3)

您似乎想要更改数据库类型:

std::vector <Employee> *EmployeeDB;

这是一个指向vector的指针,包含Employee实例。这意味着该向量包含员工的副本,可能不是您想要的。

要:

std::vector <Employee*> EmployeeDB;

这是一个矢量实例,包含指向Employees的指针。

您还应该照顾员工的所有权。一种解决方案可以使用newdelete来处理它,但首选的是使用智能指针:

std::vector <std::unique_ptr<Employee> > EmployeeDB;

编辑:在类定义中,空格标记在定义指针对象时无关紧要。

您的两个示例相同:Character* party[3]Character *party[3]表示完全相同。

真正重要的是,指针标记位于模板化类定义中(<>特化中的std::vector<>符号内部或外部)。

因此,具有[(向量)(指针)](vector <Employee*>)与使用[(向量的指针)(实例)](vector <Employee>*不同)。

答案 1 :(得分:1)

声明std::vector<Employee> *EmployeeDB时,您创建了一个指向矢量的指针。如果您希望容器保存多态类型,则需要将其声明为:

std::vector<Employee*> EmployeeDB;

从现在开始,您可以致电:

Employee *temp = new Manager(first, last, salary, meetings, vacations);
EmployeeDB.push_back(temp);

编辑:

然而,更好的编程习惯是使用std::shared_ptr<T>std::unique_ptr<T>而不是自己调用new(最终delete)。您可以通过将声明更改为:

来编写更安全的实现
std::vector<std::shared_ptr<Employee>> EmployeeDB;

并向您的向量添加元素,如下所示:

auto tmp = std::make_shared<Employee>(Manager(first, last, salary, meetings, vacations))
EmployeeDB.push_back(tmp);

不要忘记添加#include <memory>以使用sharedunique指针包装器。