【问题标题】:How can I push back onto a vector an instance of a class in C++如何将 C++ 中类的实例推回向量上
【发布时间】:2015-06-02 21:02:33
【问题描述】:

请多多包涵,这是我第一次发帖。我有3节课。 Class Suppliers 有一组Class Parent。 Class Parent 有一个 Class location 向量,Class location 有数据成员。例如(这是伪代码,不是我的实际代码。为了简单起见,我只是展示了这个):

Class Suppliers{
set<Parent> setter;
};
Class Parent{
vector<location> loc;
};

`

以下是我创建的位置类的构造函数。我没有遇到任何问题,直到我用迭代器击中这两行。我正在尝试找到一个特定的父级并将一个新位置推回到父级“loc”向量上。所以我传入了我之前找到的迭代器作为参考。但是,一旦我尝试推回我的位置类的新实例,我就会收到以下错误。

data.cpp:139:33: 错误:将 'const std::vector' 作为 'void std::vector<_tp _alloc>::push_back(const value_type&) 的 'this' 参数传递 [with _Tp = location ; _Alloc = std::allocator; std::vector<_tp _alloc>::value_type = location]' 丢弃限定符 [-fpermissive]

最后一行还给出了一个错误,说我无法更改只读对象。我很困惑为什么这将是一个只读对象。我做了一些研究,并认为我需要添加一个复制构造函数。然而,这带来的问题多于解决的问题。有什么想法吗?

location::location(set<Parent>::iterator &it, vector<string> v){ 


 sup_id = v[0];
 address1 = v[2];
 address2 = v[3];
 city = v[4];
 state = v[5];
 country = v[6];
 zip = v[7];
 ((*it).loc).push_back(*this);
 ((*it).num)++;



}

【问题讨论】:

  • 除了@Daniel Frey 的回答之外,您的代码设计真的很差,因为您不应该在在自己的构造过程中传递实例的指针。
  • @Alexandre Severino,当我初始化对象并创建一个指向该对象的指针并将其推回(在构造函数之外)时,您会建议吗?
  • 您是否考虑过使用工厂模式?您可以创建一个static 方法,该方法为其自己的类调用private constructor,并在正确实例化后添加到列表中。都在这个静态方法中。更多信息:codeproject.com/Articles/363338/Factory-Pattern-in-Cplusplus

标签: c++11 vector


【解决方案1】:

问题是set 已排序。如果允许您通过迭代器更改元素,则基本上意味着您可能会使迭代器无效,因此从 C++11 开始,setiterator常量 em> 双向迭代器,因此具有与集合的const_iterator 相同的语义。

解决方案虽然有点难看,但就是移除、修改和重新插入元素。有提议允许修改关联容器的key,但不知道标准化有没有进展。

【讨论】:

  • 谢谢!今天经过更多研究后,我得出了类似的结论并实施了地图。地图中的值不使用 const 迭代器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多