清除向量<pointer>,然后重用它

Clearing a vector<pointer> and then reusing it

本文关键字:然后 pointer 向量 lt 清除 gt      更新时间:2023-10-16

好的,所以我有一个名为 Company() 的类,它存储一个vector<pointer>;(私有)

然后我有一个名为 StaffMember() 的基类,它有两个派生类存储在向量中的(经理和休闲)

我希望能够在编辑列表或从列表中删除时清除矢量,但是当我使用诸如Company::StaffMembers.clear();之类的函数时,它会崩溃并抛出一个

"工资单系统中0x00e182f4未处理的异常.exe:0xC0000005:访问违规读取位置0x00000005。"

我例外!

我做错了什么!


公司.h

#include "StaffMember.h"
#include "Manager.h"
#include "Casual.h"
#include <vector>
using namespace std;
class Company
{
private:
    vector<StaffMember*> StaffMembers;
public:
    Company();
    void addEmployee( StaffMember* pp );
    void editEmployee( int id, string fname, string lname, double salary );
    void editEmployee( int id, string fname, string lname, int hours, double rate );
    void deleteEmployee( int id );
    StaffMember* getStaffMember( int id );
    int StaffMemberCount();
};

公司.cpp

void Company::deleteEmployee( int id )
{
    // Impossible
    // Can not delete from vector
    // index will be the id of the employee
    int index = (-1);
    int size = Company::StaffMembers.size();
    for(int i=0;i<size;i++)
    {
        // If the current member's id is the same as the one we are looking for
        if(Company::StaffMembers[i]->getID()==id)
        {
            index=i;
            break;
        }
    }
    // Index is the id of the Employee we wish to delete
    Company::StaffMembers.erase(Company::StaffMembers.begin() + index );
}

也许你需要确保找到正确的id。 在执行erase之前检查该index != -1

我猜你的程序在这条线上崩溃了:

       if(Company::StaffMembers[i]->getID()==id)

因为向量中的一个元素是 null .但这只是一个猜测。

真的应该在调试器中运行你的代码,一旦你知道你崩溃的代码行,它就会更容易发现问题。