【发布时间】:2014-05-27 20:30:06
【问题描述】:
我正在处理一项任务,即创建一群兔子,它们可以在每一轮中繁殖。所以我定义了一个Bunny的类(个体),然后定义了一个Troop的类,向量指向不同的兔子。
我的问题是,每次使用new循环创建对象Bunny,都会报错:
“调试断言失败!!...向量迭代器不可递增...”
这是我的代码示例:
class Bunny {
private:
string sex;
string color;
string name;
int age;
public:
string getname() { return name;};
Bunny(); // constructor
};
class Troop {
private:
vector<Bunny *> bunpointer;
vector<Bunny *>::iterator it;
public:
void newbunny();
void multiply();
};
void Troop::newbunny() {
Bunny * bun; // pointer to the Bunny class
bun = new Bunny;
cout << "Bunny " << bun->getname() << " is born! \n";
bunpointer.push_back(bun);
}
void Troop::multiply() {
it = bunpointer.begin();
while(it!=bunpointer.end()) {
cout << (*it)->getname() << " gave a birth. ";
newbunny();
++it;
}
it = bunpointer.begin();
}
所以如果我一开始创建 5 个兔子,并调用函数Troop::multiply,应该有 10 个兔子。一个有趣的观察是,这个错误会在 2 只兔子出生后发生。
我认为问题可能在于使用new 在迭代器循环中创建新对象。 new 可能会以某种方式中断迭代器指针 *it。但是我不确定是不是这样,如果真的是这样,该如何处理。
修改:所以实际上是使用push_back()的问题,这可能会使iterator失效!!
提前谢谢你!!
【问题讨论】:
-
为什么你需要在这个程序中使用
new?为什么不只是一个vector<Bunny>? -
psuh_back使迭代器无效。 -
嗨@chris 是的,我认为这是
push_back问题。还有@PaulMcKenzie,老实说,我真的不知道,因为我仍在努力学习C++,而我所做的只是模仿人们的程序......你能帮忙解释一下两者之间的区别吗?就我而言,我的Troop需要不断增加。 -
@CSLearner - 请参阅我的答案,以调整您在 push_back 中看到的问题的代码和其他 cmets。