如何使用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
相关产品推荐
相关产品推荐

