rusbaron
@rusbaron
Не стыдно не знать, стыдно не интересоваться

Как правильно динамически увеличить размер массива?

Пытаюсь создать аналог ассоциативного массива,через 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,значения в расширенный массив,но когда удаляю старый,данные из нового тоже удаляются.Почему так происходит?
Другие файлы находятся по адресу гитхаба
  • Вопрос задан
  • 580 просмотров
Решения вопроса 1
@iv_k
не используйте в С++ memcpy, сделайте конструктор копирования.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Правильно использовать std::vector
Ответ написан
LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии
запоминаешь указатель на текущее начало
и с помощью realloc выделяешь память и указываешь ему нашуказатель
Ответ написан
Комментировать
Olej
@Olej
инженер, программист, преподаватель
Пытаюсь создать аналог ассоциативного массива,через 2 класса.

А чем std::map не угодил?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы