c++ - 列表插入迭代器超出范围错误
问题描述
我有这个功能
void Deck::draw(Hand &hand)
{
int random = (rand() % deckCards.size()) + 1;
list<Card*>::iterator cardID = deckCards.begin();
for (int i = 1; i < random; i++) {
cardID++;
}
Card* selected = *cardID;
deckCards.erase(cardID);
hand.getHandCards().insert(hand.getHandCards().end(), selected);
}
使用以下吸气剂
list<Card*> Hand::getHandCards() const
{
return handCards;
}
我在运行时收到此错误
解决方案
这个函数返回一个副本handCards
list<Card*> Hand::getHandCards() const
{
return handCards;
}
所以,下面
- 创建一个临时副本,然后您选择它的
end()
迭代器。 - 创建另一个临时副本,您使用另一个副本中的
end()
迭代器插入。
hand.getHandCards().insert(hand.getHandCards().end(), selected);
这使得程序具有未定义的行为,即使它是合法的,两个副本都是临时的,并且将在语句结束时被销毁。
如果不查看其余代码,很难看出这是否是您执行此类操作的唯一地方,但要修复此特定功能,您应该返回对handCards
变量的引用:
list<Card*>& Hand::getHandCards()
{
return handCards;
}
再想一想:你有一个返回的成员函数,我假设是一个private
成员变量,让每个人都可以随心所欲。为什么不成功public
?如果你不喜欢这个想法,可以添加成员函数Hand
,让类的用户只做你允许的事情。
例子:
void Hand::insert(Card* card) {
handCards.emplace_back(card);
}
推荐阅读
- javascript - event.latLng returns latitude and longitude, however, I can't extract just lat or lng
- android - 如何在 Kotlin 中将两个数组与参数数组合并为一个数组?
- csv - 使用 java.io.FileOutputStream 导出 .csv
- scala - 为什么 Scala Map 上的 .map.flatten 和 flatMap 返回不同的结果?
- azure - Azure Runbook to connect to SQL server running on Azure VM
- c# - Global Function in Asp.net
- ios - Status bar not sticking to top on Some iPads
- angular - @Input/@Output check in templates
- ios - How to Merge video with audio?
- javascript - Function run function