You need to enable JavaScript to run this app. 如何使用std::vector动态实例化带参数化构造函数的C++类
优惠活动
大模型
产品
解决方案
定价
更多

如何使用std::vector动态实例化带参数化构造函数的C++类

核心问题

你的Player类仅定义了带int和string参数的构造函数,无默认无参构造函数,而vector的无参resize()、默认扩容逻辑都会调用元素的无参构造函数,会直接编译失败。另外你原代码中resize(sizeof(player))是错误写法:sizeof(player)计算的是vector对象本身的内存占用(通常是24字节左右,和元素数量无关),resize的参数应为你需要的元素个数。

常用实现方案
  • 方案1:逐个插入元素,优先使用emplace_back,可以直接传入构造函数参数,在vector的内存空间中直接构造对象,省略拷贝开销
    示例代码:
    player.emplace_back(1, "张三");
    player.emplace_back(2, "李四");
    
    也可以用push_back传入构造好的对象:
    player.push_back(Player(3, "王五"));
    
  • 方案2:调用resize时传入第二个参数作为模板对象,扩容产生的新元素都会拷贝该模板对象
    示例代码:
    // 扩容到5个元素,所有新元素都拷贝`Player(0, "默认玩家")`
    player.resize(5, Player(0, "默认玩家"));
    
  • 方案3:初始化vector时直接用初始化列表批量创建元素
    示例代码:
    vector<Player> player = {{1, "张三"}, {2, "李四"}, {3, "王五"}};
    
完整可运行代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Player {
public:
    Player(int id, string name)
     : p_id(id)
     , p_name(name)
    {}

public:
    int p_id;
    string p_name;
};

int main() {
    vector<Player> player;

    // 插入两个元素
    player.emplace_back(1, "玩家1");
    player.emplace_back(2, "玩家2");

    // 测试遍历输出
    for (const auto& item : player) {
        cout << "玩家ID:" << item.p_id << ",玩家名称:" << item.p_name << endl;
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者Inayat Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 06:54:02