所以基本上我想制作一个名为
的矢量 vector <Employee> *EmployeeDB;
Employee *temp;
我想把它放在
里面 temp = new Manager(first, last, salary, meetings, vacations);
EmployeeDB->push_back(*temp);
哦我正在使用继承和多态,这就是为什么new是Manager类型。
P.S我忘了,父类是Employee,它有3个继承父类的子类。 3个子类是经理,研究员和工程师类。
答案 0 :(得分:3)
您似乎想要更改数据库类型:
std::vector <Employee> *EmployeeDB;
这是一个指向vector的指针,包含Employee实例。这意味着该向量包含员工的副本,可能不是您想要的。
要:
std::vector <Employee*> EmployeeDB;
这是一个矢量实例,包含指向Employees的指针。
您还应该照顾员工的所有权。一种解决方案可以使用new
和delete
来处理它,但首选的是使用智能指针:
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>
以使用shared
和unique
指针包装器。