我正在尝试在向量中创建现有对象的列表。以下是我到目前为止的情况:
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在->
和ptr
之间的符号push_back
处抛出错误,说“没有重载功能的实例”。
我应该做什么,也许你有任何提示?
答案 0 :(得分:1)
如何正确地向对象添加对象,而不需要两次调用析构函数
使用emplace_back
:
ptr->emplace_back(name);
问题是析构函数会被调用两次......因此,我得到一个错误(显然)。
这不应该导致行为良好的类出错。如果调用push_back
导致您出现问题,则提示Client
类有问题。确保它可以正确复制和分配。
答案 1 :(得分:0)
问题是你的误解
问题是析构函数将被调用两次:首先,当方法addClient结束时,第二次,当调用此方法类的析构函数时。
以上不是问题。将对象插入std::vector<Client>
时,您正在插入副本。析构函数运行两次,因为在复制完成后,有两个对象。
如果这实际上导致您出错,则Client
很可能无法正确复制,您需要使其可复制或重新考虑您的使用方式。