指针向量的迭代器

| 我读了另一篇文章,回答了有关指针向量的迭代器的问题。我尝试在代码中使用相同的概念,但收到一些编译错误。我基于我的代码的代码示例是:
vector<c*> cvect;
cvect.push_back(new sc);
vector<c*>::iterator citer;
for(citer=cvect.begin(); citer != cvect.end(); citer++) {
    (*citer)->func();
}
我想使用类似的概念为具有两个数据成员的类的类创建深层复制构造函数,这两个数据成员是指向对象的指针的向量。我的代码与此类似:
class MyContainer {
    vector<MyStuff*> vecOne;
    vector<MyStuff*> vecTwo;

 public:
    MyContainer(const MyContainer& other);
};

MyContainer::MyContainer(const MyContainer& other) {
    // copy vector one
    vector<MyStuff*>::iterator vec1_itr;
    for (vec1_itr = other.vecOne.begin(); vec1_itr != other.vecOne.end(); vec1_itr++) {
        vecOne.push_back(new MyStuff(vec1_itr));
    }

    // copy vector two
    vector<MyStuff*>::iterator vec2_itr;
    for (vec2_itr = other.vecTwo.begin(); vec2_itr != other.vecTwo.end(); vec2_itr++) {
        vecTwo.push_back(new MyStuff(vec2_itr));
    }
}
我收到一些编译错误,例如:   /path/MyContainer.cpp:38:错误:\'
vec1_Itr = other->MyContainer::vecOne. std::vector<_Tp, _Alloc>::begin [with _Tp = MyStuff*, _Alloc = std::allocator<MyStuff*>]()
\'中的\'
operator=
\'不匹配      候选人是:
__gnu_cxx::__normal_iterator<MyStuff*, std::vector<MyStuff, std::allocator<MyStuff> > >& __gnu_cxx::__normal_iterator<MyStuff*, std::vector<MyStuff, std::allocator<MyStuff> > >::operator=(const __gnu_cxx::__normal_iterator<MyStuff*, std::vector<MyStuff, std::allocator<MyStuff> > >&)
我也得到
operator!=
的错误...以及另一向量的另一组相同的错误。     
已邀请:
您忘记了取消引用迭代器。尝试以下方法:
vecOne.push_back(new MyStuff( **vec1_itr ));
编辑0: 是的,应该被双重取消引用(上面已解决)。它应该是
const_terator
,因为您正在处理包含对象的
const
vector<MyStuff*>::const_iterator vec1_itr;
    
不要将参数设为
const
或将
vec1_itr
声明为
const_iterator
。这里的问题是
vecOne.begin()
返回
const_iterator
,因为容器是
const
。如果要更改容器,则必须删除
const
限定词。 附带说明一下,如果持有一个指针容器意味着您需要管理该容器中的指针,并且您有两个这样的容器,则应将该容器移到其自己的类中。尝试避免在一个类中管理多个资源。     
!!内存泄漏警报! 您的代码本身是泄漏的。 复制构造函数(
std::bad_alloc
?)内抛出的任何异常都将导致内存泄漏,因为传递给
vector
的内存将永远不会被清除(由于对象从未被构造,所以不会调用析构函数) 。 当然,您可以添加所需的ѭ19,尽管我警告您代码会很快变得笨拙(您需要几个)。 这是违反资源管理规则1的直接结果:   一个对象最多只能管理一种资源,在这种情况下,它不应做任何其他事情。 这意味着,如果您的对象是业务对象(内部具有应用程序逻辑),则它不应直接处理资源管理,而应使用现有的管理器。 就您而言,您有两种解决方案: 推荐:由于这里没有使用多态,所以不要使用指针。
std::vector<MyStuff>
很好 如果您需要多态性,但未在本玩具示例中包含它,请使用
boost::ptr_vector<MyStuff>
优点:他们两个定义了明智的副本构造函数,赋值运算符和析构函数,因此您不必自己重写它们。 编辑: 如@David所述,如果需要多态,则不能使用副本构造,因此需要:
clone
方法或等效方法 指针和动态内存分配
boost::ptr_vector
提供了您所需的一切(复制时自动使用
clone
方法)。     

要回复问题请先登录注册