You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:24:00