【问题标题】:Using vector to hold class objects使用向量来保存类对象
【发布时间】:2018-04-28 04:50:42
【问题描述】:

已解决:改为使用指针向量

我有一个名为 Nurse 的类,我想要一个 Nurse 对象大小为 numNurses 的向量。每个对象都有唯一的数据。 我首先尝试用代码来做到这一点

std::vector<Nurse> allNurses;
for (int i=0; i<numNurses; i++){ 
allNurses.push_back (Nurse(input,numShifts,numDays,inRow,nurMaxDay,nurMinDay,1));
}

但我发现更改任何护士的数据,被某些人引用 对 allNurses 的索引(例如allNurses[0])会影响每个 向量的其他成员。

我想也许我只需要在某个地方调用 new,因为我可能从未创建过新对象。尝试类似

allNurses[i]= new Nurse(input,numShifts,numDays,inRow,nurMaxDay,nurMinDay,1);

导致了一个错误(我认为不是太重要):

Optimize_Schedule.cpp:在构造函数中 'Optimize_Schedule::Optimize_Schedule(int)':

Optimize_Schedule.cpp:38:17:错误:'operator=' 不匹配(操作数 类型是“护士”和“护士*”)

 allNurses[i]= new Nurse(input,numShifts,numDays,inRow,nurMaxDay,nurMinDay,1);
             ^ In file included from Optimize_Schedule.cpp:5:0:

Nurse.h:15:7: 注意:候选人:Nurse& Nurse::operator=(const Nurse&) 护士班{

                                                                        ^

Nurse.h:15:7: 注意:从 'Nurse*' 得到的参数 1 没有已知的转换 to 'const Nurse&'

【问题讨论】:

  • 当你的向量增长时,它会复制你的对象。旧对象将被销毁,新复制的对象将取而代之。另外,考虑查看emplace_back 而不是push_back。 (实际上,重读,我不确定为什么每个护士都会被修改,我不确定我们是否有足够的代码知道原因。尽管使用第一种语法,您肯定是在创建对象)。
  • 您的第一个代码示例是拥有彼此不影响的护士向量的正确方法。如果您仍然遇到问题,请发布 MCVE 以显示意外行为
  • 有很多代码,所以我稍后可能会重新创建问题,但我认为这个小时可能工作量太大。我知道它不起作用的方式是每个护士都有一个存储为初始化为全 0 的整数数组的时间表。然后我调用 assign(0),它为 allNurses[0] 分配 schedule[0]=1。之后我调用 allNurses[1].printSchedule() 只是为了找到我对影响 allNurses[1] 的 allNurses[0] 的分配
  • @NickHZ 正如其他人所说,您的第一种方法不应导致一次更新影响数组中的其他元素。所以也许问题是每个 Nurse 对象如何保存这个整数的调度数组——也许它们都指向同一个数组。如果您无法发布所有代码,请检查所有 Nurse 对象是否只有该部分发生更改,而对象的其他部分可能没有更改。
  • 我们需要查看Nurse的定义才能知道它有什么问题。您可以使用vector

标签: c++ class vector


【解决方案1】:

allNurses 声明用于向量或 Nurse 对象,按值

std::vector<Nurse> allNurses;

所以你不想调用返回指针的“new”。
关于 'operator=' 的抱怨是因为该行试图将 Nurse 指针 分配给 Nurse instance

allNurses[i]= new Nurse(...);

关于原症状:
没有足够的信息来理解为什么更改一个 Nurse 对象可能会影响其他对象 - 但是可能会有不同的解释。由于这是一个对象向量(不是对象指针向量),因此在扩展向量时可能会使用默认的复制构造函数。如果 Nurse 包含无法逐个元素复制的任何成员,则您需要自己的复制构造函数。 (在 C++11 中移动构造函数。)

替代方法可能是使用(智能)指针向量。然后 "operator=" 就可以了。
(如果沿着这条路线走,请考虑使用智能指针,以便在需要释放向量时无需显式清理所有向量元素。)

顺便说一句,如果你有 C++11 并且正在使用按值的向量,请考虑使用“emplace_back”而不是“push_back”来就地附加新构造的 Nurse 对象,如下所示:

allNurses.emplace_back(input,numShifts,numDays,inRow,nurMaxDay,nurMinDay,1);

【讨论】:

  • 在重新阅读您的问题时,您提到更改 Nurse 实例会影响 所有 个其他 Nurse 实例。我怀疑这是针对在此对象实例之外为其分配了内存的成员。就像 Nurse 内部的成员变量一样,它是指向其他信息的指针。 (一个数组?)如果是这样,那么即使 Nurse 实例不在向量中也是如此。
猜你喜欢
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2022-11-17
  • 2016-01-23
  • 1970-01-01
  • 2014-04-20
  • 2016-05-16
  • 2015-09-09
相关资源
最近更新 更多