@PUTINVODKAGTA

Увеличение размера массива объектов?

Код
#pragma once
#include <iostream>
#include <string>
#include "Class_Date.h"

class Class_ListPerson :public Date
{
public:
	Class_ListPerson()
	{
		name = "";		
	}

	~Class_ListPerson()
	{
		delete[]list_person;
	}

	void choose_fun(Class_ListPerson&one)
	{
		bool check = true;
		int choice = 0;
		while (check)
		{
			cout << "Выберите функцию:\n1.Добавить\n2.Показать" << endl;
			cin >> choice;
			switch (choice)
			{
			case 1:
				add(one);
				break;
			case 2:
				out(one);
				break;
			case 3:
				cout << "Выход" << endl;
				check = false;
				break;
			default:
				cout << "Ошибка ввода!" << endl;
				break;
			}
		}	
	}

	void add(Class_ListPerson&one)
	{		
		if (size==0)
		{
			list_person[size].init(name, date);
			size++;
		}
		else
		{   			
			Class_ListPerson* list_person_temp = new Class_ListPerson[size++];
			for (int i = 0; i < size; i++)
			{
				list_person_temp[i] = list_person[i];
			}
			list_person[size-1].init(name, date);
			delete[]list_person;
			list_person = list_person_temp;				
		}			
	}
	
	void init(string&name,Date &date)
	{		
		cout << "Введите имя: ";
		cin >> name;	
		date.read();	
	}

	void out(Class_ListPerson&one)
	{
		for (int i = 0; i < size; i++)
		{
			list_person[i].show_person(name, date);
		}
		
	}	

	void show_person(string& name, Date& date)
	{		
		cout <<"Имя - "<< name << endl;
		date.display();		
	}
	
private:
	string name;
	Date date;
	int id;
	int size=0;
	Class_ListPerson* list_person = new Class_ListPerson[size];
	
};


Добрый вечер! Подскажите в чем проблема.

По заданию нужно создать класс с 2 полями Имя и дата. Так же класс должен содержать массив объектов класса.
Есть 2 вопроса:
1) Правильно ли объявлен массив?
Class_ListPerson* list_person = new Class_ListPerson[size]; 
//size = 0, т.к. при других значениях ничего не происходит

2) При добавлении элемента массива, после объявлении нового массива размером size+1, в цикле for, где происходит копирование элементов, ломается программа. В отладчике появляется следующая ошибка:

Вызвано исключение по адресу 0x00007FFBF98D163C (vcruntime140d.dll) в 33333.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000015E54BD5FF8.
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
@rPman
массивы инициализируются по другому
Class_ListPerson[size]={Class_ListPerson(...),Class_ListPerson(...),..};
если есть конструктор без аргументов, то можно без всего что справа.

Изменить размер массива нельзя, так как его размер не хранится нигде и является константой, т.е. придется работать не с самим массивом а ссылкой на него и заполнять вручную через выделение памяти (можно конечно работать со ссылкой на первый элемент как у вас, но это bad practics, ссылки надо избегать всеми способами).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@hauptling
используйте контейнеры, например, vector.

class Class_ListPerson{
public:
    void addnewlist(){
        Class_ListPerson object;
        m_vector.push_back(object);
    }
    
private:
    std::vector<Class_ListPerson> m_vector;
    char* m_name;
    uint8_t m_data;
};
Ответ написан
@galaxy
При добавлении элемента массива, после объявлении нового массива размером size+1

Нового массива какого-какого размера?
Class_ListPerson* list_person_temp = new Class_ListPerson[size++];
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы