【问题标题】:C++ How to make a vector with a class type pointerC ++如何使用类类型指针制作向量
【发布时间】:2018-02-26 15:35:04
【问题描述】:

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

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

我想把这个放在里面

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

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

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

【问题讨论】:

  • 您可以创建vector,它包含指向Employee 的指针,即vector&lt;Employee*&gt;
  • 我没有看到问号。请提供您问题的完整简约可验证示例 (stackoverflow.com/help/mcve)

标签: c++ pointers inheritance polymorphism


【解决方案1】:

当声明std::vector&lt;Employee&gt; *EmployeeDB 时,您创建了一个指向向量的指针。如果你想让你的容器保存多态类型,你需要像这样声明它:

std::vector<Employee*> EmployeeDB;

从现在开始,您可以拨打:

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

编辑:

但是,更好的编程习惯是使用std::shared_ptr&lt;T&gt;std::unique_ptr&lt;T&gt; 而不是自己调用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 &lt;memory&gt; 以使用 sharedunique 指针包装器。

【讨论】:

  • 我正在用这样的实现来编辑答案。请一秒钟
【解决方案2】:

看来你要更改数据库类型,来自:

std::vector <Employee> *EmployeeDB;

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

收件人:

std::vector <Employee*> EmployeeDB;

这是一个向量实例,持有指向员工的指针。

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

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

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

你的两个例子是一样的:Character* party[3]Character *party[3] 意思完全一样。

真正重要的是指针标记在模板类定义中的位置(在 &lt;&gt; 符号的内部或外部 std::vector&lt;&gt; 专业化)。

因此,拥有 [(vector) (of pointers)] (vector &lt;Employee*&gt;) 与拥有 [(pointer to a vector) (of instances)] (vector &lt;Employee&gt;*) 是不一样的。

【讨论】:

  • omg 非常感谢,但我还是不太明白,再举一个例子,Character* party[3] 可以吗?但是字符 *party[3] 不会?因为指针在数组而不是类类型?
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多