我的代码存在一些问题,其结构与显示的类似。它不起作用!我认为主要问题是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;
}
答案 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;
}
};