Пытаюсь создать аналог ассоциативного массива,через 2 класса.
Одни класс где описываются сами данные:
data.h
#pragma once
#include "myString.h"
enum gender{MALE,FEMALE};
class data
{
MyString surname, name, position;
unsigned char age;
int salary;
gender myGen;
public:
/*data();*/
data(MyString nameIn = MyString("Anonymous"), MyString positionIn = MyString("No position"), unsigned char ageIn = 18, int salaryIn = 8000, gender genIn = MALE, MyString surnameIn = MyString("Anonymous"));
friend ostream& operator<<(ostream& os, const data& inputData);
data& operator=(const data& inputData);
~data();
friend class BD;
};
data.cpp
#include "data.h"
using namespace std;
data::data(MyString nameIn, MyString positionIn, unsigned char ageIn, int salaryIn, gender genIn, MyString surnameIn)
{
myGen = genIn;
name = nameIn;
surname = surnameIn;
age = ageIn;
salary = salaryIn;
position = positionIn;
}
data::~data()
{
}
ostream& operator<<(ostream& os, const data& inputData){
os << "Surname: " << inputData.surname << "\nName: " << inputData.name << "\nAge: " << static_cast<int>(inputData.age) << "\nSalary: " << inputData.salary << "\nPosition: " << inputData.position << endl;
return os;
}
data& data::operator=(const data& inputData){
this->age = inputData.age;
this->myGen = inputData.myGen;
this->name = inputData.name;
this->position = inputData.position;
this->salary = inputData.salary;
return *this;
}
и так называемый класс обёртка,где я переопределяю функцию доступа к данным
BD.h
#pragma once
#include "data.h"
class BD
{
data* man;
int cap;
public:
BD();
data& operator[](const MyString& family);
friend ostream& operator<<(ostream& os, const BD& inputBD);
~BD();
};
BD.cpp
#include "BD.h"
BD::BD()
{
man = nullptr;
//man = new data[1];
cap = 0;
}
BD::~BD()
{
delete[] man;
}
data& BD::operator[](const MyString& family){
for (int i = 0; i < cap; i++){
if (this->man[i].surname == family){
return this->man[i];
}
}
cap++;
data* tmp = new data[cap];
if (cap>1)
{
memcpy(tmp, this->man, sizeof(data)*(cap-1));
delete[] this->man;
}
this->man = tmp;
this->man[cap - 1].surname=family;
return this->man[cap - 1];
}
ostream& operator<<(ostream& os, const BD& inputBD){
for (int i = 0; i < inputBD.cap; i++)
{
os << "Person #" << inputBD.cap << "\n" << inputBD.man << std::endl;
}
return os;
}
Проблема уже возникает при переопределении оператора [],в момент
memcpy(tmp, this->man, sizeof(data)*(cap-1));
delete[] this->man;
Я копирую из уже текущего элемента man,значения в расширенный массив,но когда удаляю старый,данные из нового тоже удаляются.Почему так происходит?
Другие файлы находятся по адресу
гитхаба