c++ - 遍历抽象类的向量时出错
问题描述
使用多态性,我从一个名为 Item 的抽象类创建了沙发、床和桌子类。printDetails() 是 Item 类中的一个虚函数,它为 Sofa、Bed 和 Table 类重新定义。我还创建了一个用于处理 Items 向量的类,称为 ItemVector。我已经用下面的函数填充了沙发、床和桌子的项目向量
void ItemVector::AddItem() {
string Answer = "y";
while (Answer == "y") {
cout << "Would you like to register a sofa to the warehouse stock (y/n)?" << endl;
cin >> Answer;
if (Answer == "y") {
Sofa newSofa;
itemVector.push_back(&newSofa);
}
else if (Answer != "n") Answer = "y";
}
Answer = "y";
while (Answer == "y") {
cout << "Would you like to register a bed to the warehouse stock (y/n)?" << endl;
cin >> Answer;
if (Answer == "y") {
Bed newBed;
itemVector.push_back(&newBed);
}
else if (Answer != "n") Answer = "y";
}
Answer = "y";
while (Answer == "y") {
cout << "Would you like to register a table to the warehouse stock (y/n)?" << endl;
cin >> Answer;
if (Answer == "y") {
Table newTable;
itemVector.push_back(&newTable);
}
else if (Answer != "n") Answer = "y";
}
}
然后在包含“(*pos)->printDetails();”的行中引发错误 在下面的代码中。错误显示“Project1.exe 中 0x0038FDAA 处的未处理异常:0xC0000005:访问冲突读取位置 0xCCCCCCCC。”
void ItemVector::DisplayInfo() {
vector<Item*>::const_iterator pos;
int i = 0;
for (pos = itemVector.begin(); pos != itemVector.end(); ++pos) {
cout << "Item number " << ++i << " has the following details:\n";
(*pos)->printDetails();
}
我怎样才能避免这种情况?我想对所有物品使用单一向量,而不是对沙发、床和桌子使用单独的向量。
解决方案
像这样的线条
{
Sofa newSofa;
itemVector.push_back(&newSofa);
}
不好,因为像这里这样的非静态局部变量是这个块的本地变量newSofa
,并且在退出这个块时被消除。因此,退出该块后不能使用指针。
取而代之的是,您应该将对象分配给堆,以便在退出块后保留以供以后使用。
可以这样做:
{
itemVector.push_back(new Sofa());
}
推荐阅读
- python - 从 MySQL 语句中获取结果并存储在 Python 列表中并检查条件
- php - 使用PHP单击Mysql中的按钮时无法插入
- while-loop - 在调试中工作但不发布的循环
- c# - 如何按顺序运行 AWS lambda 函数
- angular - Angular 7 PWA 网络存储选择
- libxlsxwriter - 使用 Libxlsxwriter 在 Excel 中读取单元格值?
- php - Php:在文件中动态替换文件名和变量
- azure-cosmosdb - 当我们没有获得相应函数的指标时,如何记录 Cosmos DB CountAsync 和 MaxAsync 操作的 RequestCharge?
- html - 我可以从 fields_for 为 div 设置一个 id 吗?
- jquery - 输入中只允许数字和“.”(点)