首页 > 解决方案 > 遍历抽象类的向量时出错

问题描述

使用多态性,我从一个名为 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();
    }

我怎样才能避免这种情况?我想对所有物品使用单一向量,而不是对沙发、床和桌子使用单独的向量。

标签: c++pointersvectorabstract-class

解决方案


像这样的线条

{
    Sofa newSofa;
    itemVector.push_back(&newSofa);
}

不好,因为像这里这样的非静态局部变量是这个块的本地变量newSofa,并且在退出这个块时被消除。因此,退出该块后不能使用指针。

取而代之的是,您应该将对象分配给堆,以便在退出块后保留以供以后使用。

可以这样做:

{
    itemVector.push_back(new Sofa());
}

推荐阅读