C++迭代器访问指针成员报错:表达式需指向类类型却为CharacterBase*
问题解决:存储指针的vector迭代器访问成员报错
错误原因
你的ptrCharacterTurnOrderArray是存储CharacterBase*指针的vector,迭代器iterator指向的是指针元素(而非对象本身)。当你用iterator->getCharacterName()时,相当于对CharacterBase*类型的指针再调用->,这不符合语法——你需要先拿到指针,再用->访问对象成员。
两种修复方案
方案1:解引用迭代器后访问指针成员
直接对迭代器解引用得到CharacterBase*指针,再用->调用成员函数:
player_ptr = &PC; enemy_ptr = &Enemy; ptrCharacterTurnOrderArray.push_back(player_ptr); ptrCharacterTurnOrderArray.push_back(enemy_ptr); for (auto iterator = ptrCharacterTurnOrderArray.begin(); iterator != ptrCharacterTurnOrderArray.end(); iterator++) { engineFeedback = engineFeedback + "\n Name: " + (*iterator)->getCharacterName() + " Initiative: " + std::to_string((*iterator)->getCharacterInitiative()) + " Player Character Flag: " + std::to_string((*iterator)->getIsPlayerCharacter()); (*iterator)->setCharacterTurnOrder(iterator - ptrCharacterTurnOrderArray.begin() + 1); engineFeedback = engineFeedback + "\nTurn Order: " + std::to_string((*iterator)->getCharacterTurnOrder()); }
方案2:用范围for循环简化代码
范围for循环可以直接拿到vector里的指针元素,代码更简洁易读:
player_ptr = &PC; enemy_ptr = &Enemy; ptrCharacterTurnOrderArray.push_back(player_ptr); ptrCharacterTurnOrderArray.push_back(enemy_ptr); int turnOrder = 1; for (auto char_ptr : ptrCharacterTurnOrderArray) { engineFeedback = engineFeedback + "\n Name: " + char_ptr->getCharacterName() + " Initiative: " + std::to_string(char_ptr->getCharacterInitiative()) + " Player Character Flag: " + std::to_string(char_ptr->getIsPlayerCharacter()); char_ptr->setCharacterTurnOrder(turnOrder++); engineFeedback = engineFeedback + "\nTurn Order: " + std::to_string(char_ptr->getCharacterTurnOrder()); }
额外说明
之前处理对象引用的vector时,迭代器直接指向对象实例,所以iterator->xxx是正确的。但存储指针的vector里,迭代器指向的是指针变量,必须先拿到指针再访问成员——这是指针容器和对象容器的核心区别之一。
内容的提问来源于stack exchange,提问作者Strom
相关产品推荐
相关产品推荐

