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

C++建造者模式实现问题:创建类指针向量生成多对象

嘿,我来帮你搞定这个问题!

你现在遇到的核心问题是QVector初始化后是空的,直接通过索引toys[i]赋值会触发越界访问——因为向量里还没有对应位置的元素,这么写肯定会报错或者出现未定义行为。

给你几个可行的解决方案:

方案1:使用push_back/append添加元素

先准备好你的参数集合(比如用数组或者向量存不同的参数值),然后在循环里创建对象并添加到向量中:

// 假设你的NormalToyBuilder构造函数需要int和QString类型的参数,先准备参数
QVector<int> toyIds = {101, 102, 103, 104};
QVector<QString> toyNames = {"Car", "Doll", "Plane", "Truck"};

QVector<ToyBuilder*> toys;
for(int i = 0; i < 4; i++){
    // 传入对应索引的参数,把新对象添加到向量末尾
    toys.push_back(new NormalToyBuilder(toyIds[i], toyNames[i]));
}

方案2:提前预留空间(可选优化)

如果知道要创建的对象数量,可以先给向量预留空间,避免多次扩容带来的性能开销:

QVector<ToyBuilder*> toys;
toys.reserve(4); // 提前预留4个元素的空间
for(int i = 0; i < 4; i++){
    toys.append(new NormalToyBuilder(/* 你的不同参数 */));
}

重要提醒:内存管理

因为你用了new创建对象,记得在不需要这些对象的时候手动释放内存,防止内存泄漏:

// 遍历向量释放每个对象
for(auto builder : toys){
    delete builder;
}
toys.clear(); // 清空向量

如果你想更省心,推荐使用智能指针(比如std::unique_ptr),它会自动管理内存,不用手动delete:

#include <memory> // 需要包含头文件

QVector<std::unique_ptr<ToyBuilder>> toys;
for(int i = 0; i < 4; i++){
    toys.push_back(std::make_unique<NormalToyBuilder>(/* 你的参数 */));
}
// 不需要手动释放,智能指针会在向量销毁时自动清理对象

这样修改后,你就能顺利创建多个NormalToyBuilder对象并存储到QVector里啦!

内容的提问来源于stack exchange,提问作者sarth sachdeva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:14:33