C++中如何将vector<User>改为vector<User*>并正确调用对应函数
解决方案
第一步:修改promptUserAction函数定义
你需要修改函数的第一个参数类型,同时调整函数内部的成员访问语法,修改后的完整代码如下:
void promptUserAction(vector<User*> &players, int playernumber, const Room rooms[], string &strCh, BadGuy bad) { // 输出用户位置和房间描述 cout << *players[playernumber] << " you are currently in " << rooms[players[playernumber]->getIndexofCurrentRoom()] << endl; if (players[playernumber]->getIndexofCurrentRoom() == bad.getIndexCurrentRoom()) { cout << "There is a bad guy (" + bad.getName() + ") also in the room." << endl; } // 提示用户选择操作 cout << "What would you like to do?" << endl << "**********************" << endl; cin >> strCh; }
本次修改核心调整点:
- 第一个参数从
vector<User> &players改为vector<User*> &players - 访问
User对象成员时,.运算符改为指针专用的->运算符 - 输出
User对象时增加*解引用,匹配你原本重载的<<运算符参数要求
第二步:调整调用侧逻辑
方案1(推荐):修改原有players变量的类型
将你main函数中定义的players从vector<User>类型改为vector<User*>,初始化时存入User对象的指针即可:
// 示例初始化代码 vector<User*> players; // 动态创建User对象存入容器,也可以存入栈上User对象的地址(需保证生命周期足够) players.push_back(new User(/* 你的构造参数 */)); players.push_back(new User(/* 你的构造参数 */));
完成变量类型修改后,你原本的调用代码不需要做任何改动,直接使用即可:
do { promptUserAction(players, User::IndNextUser, rooms, UserAction, badGuy1); // 原有其他逻辑 } while (/* 你原本的循环条件 */);
小提示:如果使用裸指针存储堆上的User对象,记得在程序退出前遍历vector释放所有对象,避免内存泄漏;也可以直接改用
vector<std::unique_ptr<User>>自动管理内存,函数访问逻辑和裸指针完全一致。
方案2(兼容场景):不修改原有players类型
如果你不想改动原有vector<User>类型的定义,调用时临时构造一个指针向量传入即可:
do { vector<User*> player_ptrs; for (auto& user : players) { player_ptrs.push_back(&user); } promptUserAction(player_ptrs, User::IndNextUser, rooms, UserAction, badGuy1); // 原有其他逻辑 } while (/* 你原本的循环条件 */);
该方案每次循环都会生成临时向量,性能略低,仅适合临时兼容场景。
内容的提问来源于stack exchange,提问作者Kennedy Perry
相关产品推荐
相关产品推荐

