-2

我正在尝试在向量中创建现有对象的列表。这是我到目前为止所拥有的:

   void Program::addClient(string name){
      vector<Client> *ptr = &(impl->clients);
      Client cl(name);
      ptr->push_back(cl);
   }

问题是析构函数将被调用两次:第一次,当方法 addClient 结束时,第二次,这个方法类的析构函数将被调用。因此,我得到一个错误(显然)。所以我想写这样的东西:

   void Program::addCategory(string name){
      vector<Category> *ptr = &(impl->categories);
      Category *c = new Category(name);
      ptr->push_back(c);
   }

通过这样做,我相信,我会摆脱析构函数的问题,但还有另一个问题。我的 IDE 在和->之间的符号处抛出一个错误,说“没有重载函数的实例”。ptrpush_back

我应该怎么做,也许你有什么建议?

4

2 回答 2

1

如何正确地将对象添加到向量中,而无需两次调用析构函数

emplace_back

ptr->emplace_back(name);

问题是析构函数将被调用两次......因此,我得到一个错误(显然)。

对于表现良好的类,这不应导致错误。如果打电话给push_back你带来了问题,那就暗示Client班级出了问题。确保它是正确可复制和可分配的。

于 2013-11-12T17:12:36.203 回答
0

问题是你的误解

问题是析构函数将被调用两次:第一次,当方法 addClient 结束时,第二次,这个方法类的析构函数将被调用。

以上不是问题。当您将对象插入 astd::vector<Client>时,您正在插入一个副本。析构函数运行两次,因为在复制完成后,有两个对象。

如果这实际上导致您出错,则很可能Client无法正确复制,您需要使其可复制或重新考虑如何使用它。

于 2013-11-12T17:21:00.037 回答