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
相关产品推荐
相关产品推荐

