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

Pointer to object in a class: push_back and pointers conflicts

本文关键字:指针 push back 冲突 对象      更新时间:2023-10-16

我对与所示代码结构相似的代码有几个问题。不行!我认为主要问题是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;
}

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

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

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

狗类需要一个复制 ctor。这至少是一个致命的问题,随着狗的副本被创建,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;
  }

};