指向类中对象的指针:push_back和指针冲突

时间:2014-03-02 13:56:58

标签: c++ vector push-back

我的代码存在一些问题,其结构与显示的类似。它不起作用!我认为主要问题是push_back函数,我需要其他作用域(我需要在操作期间构建一个类向量,并且在单个类内部也有指针)。谁知道怎么解决?感谢

#include <vector>
using namespace std;

class meow {
public:
  int b;
  meow() {
    b = 1;
  } 
  meow(int a) {
    b = a;
  } 
};

class dog {
public:
  vector<meow> H;
  vector<vector<meow>::iterator> HP;

  dog()
    : HP(2), H(2) {
   HP[0] = H.begin();
   HP[1] = H.begin() + 1;
  }
};

int main() {
  vector<dog> WOOF(1);
  WOOF.push_back(dog());
  meow ok(2);
  (*WOOF[1].HP[0]) = ok;
  cout << (*WOOF[0].HP[0]).b << endl;
  cout << (*WOOF[1].HP[1]).b << endl;
}

好的,我理解这笔交易,所以有可能做这样的事情,如果我不会在代码中使用push_back吗?

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

class meow {
public:
  int b;
  meow() {
    b = 1;
  } 
  meow(int a) {
    b = a;
  } 
};

class dog{
public:
vector <meow> H;
vector<vector<meow>::iterator> HP;
dog():
    HP(2),H(2){
}
    void Referring(){
        HP[0]=H.begin();
        HP[1]=H.begin()+1;  
    }
};


int main() {
  vector<dog> WOOF(1);
  WOOF.push_back(dog());
  for(int i=0;i<WOOF.size();++i){
      WOOF[i].Referring();

  }
  meow ok(2);
  (*WOOF[1].HP[0]) = ok;
  cout << (*WOOF[0].HP[0]).b << endl;
  cout << (*WOOF[1].HP[1]).b << endl;
}

2 个答案:

答案 0 :(得分:3)

dog::HP中,存储指向dog::H向量元素的迭代器。复制dog对象时,新对象的HP中复制的迭代器仍将指向原始对象的向量H。当原始对象被销毁时,新对象中的迭代器将不再指向任何有用的东西。

这是main()中发生的情况,其中临时dog对象被复制到WOOF

一般来说,首先将迭代器存储为像这样的迭代器可能不是一个好主意。当H被修改时,HP中的所有迭代器都将失效并且不再安全使用。

答案 1 :(得分:1)

狗类需要复制品。这至少是一个致命的问题,导致了push_back的灾难,因为创建了狗的副本。默认复制ctor将按值复制指针,以便它们指向错误的(旧)地址。增强的狗类:

class dog {
public:
  vector<meow> H;
  vector<vector<meow>::iterator> HP;

  dog() : HP(2), H(2)
  {
     HP[0] = H.begin();
     HP[1] = H.begin() + 1;
  }
  dog(const dog& rhs) : H(rhs.H),HP(2)
  {
     HP[0] = H.begin();
     HP[1] = H.begin() + 1;
  }
  dog& operator=(const dog& rhs)
  {
     if(&rhs==this)
        return *this;
     H=rhs.H;
     HP[0] = H.begin();
     HP[1] = H.begin() + 1;
  }

};