清除向量<pointer>,然后重用它
Clearing a vector<pointer> and then reusing it
好的,所以我有一个名为 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
.但这只是一个猜测。
真的应该在调试器中运行你的代码,一旦你知道你崩溃的代码行,它就会更容易发现问题。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- C++:如何读取分离变量,然后读取向量
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 如何正确地推回然后遍历堆中对象的向量?
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- 如何在字符串中找到字符,然后在C++中提取其余的字符串
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 清除向量<pointer>,然后重用它