@PUTINVODKAGTA

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

Добрый вечер!

Суть задачи такая: Создать базовый класс Array, в нем объявить поле-массив подходящего типа и переменную хранящую размер у текущего объекта-массива. Реализовать класс Person как производный класс от класса Array, использовать открытое наследование.

Каким образом это можно сделать? Если я объявляю массив класса Person в классе Array мне выдаёт ошибки:


Ошибка C2065 list: необъявленный идентификатор
Ошибка C2061 синтаксическая ошибка: идентификатор "Person"


#include <iostream>
#include "Class_Person.h"

class Class_Array
{	
	int count = 1;	
public:
	Class_Array()
	{
		for (std::size_t i = 0; i < count; i++)
			list[i] = 0;
	}
	~Class_Array()
	{		
	}
private:
	Person** list = new Person * [count];//	
};


КОД
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include "Class_Date.h"
#include "Class_Array.h"

class Person:public Class_Array
{	
	 bool check_create = false;
	 bool check_nam = true;
public:
	Person(Person**& list, int &count)
	{
		for (std::size_t i = 0; i < count; i++) 
			list[i] = 0;		
	}

	Person()
	{		
		name = "";
	}

	~Person()
	{		
		cout << "Сработал деструктор" << endl;
		cout << "//===================================================" << endl;		
	}

	void set_name(string name)
	{
		this->name = name;
	}

	string get_name()
	{
		return name;
	}

	bool check_name(Person**& list,int &count, string check_name_,bool &check_nam)
	{
		for (int i = 0; i < count; i++)
		{
			if (check_name_ == list[i]->name)
			{
				cout << "Такая фамилия уже существует в списке!" << endl;
				return check_nam = true;
			}
			else
			{
				return check_nam = false;
			}
		}		
	}

	void choose_fun(Person**& list, int &count)
	{
		bool check = true;
		int choice = 0;
		while (check)
		{
			cout << "Выберите функцию:\n1.Создать список\n2.Заполнить\n3.Показать\n4.Добавить\n5.Удалить\n6.Выход" << endl;
			cin >> choice;
			switch (choice)
			{
			case 1:
				create(list,check_create, count);
				break;
			case 2:
				system("cls");
				fillin(list, count);
				break;
			case 3:
				system("cls");
				show(list, count);
				break;
			case 4:
				system("cls");
				add(list, count);
				break;
			case 5:
				system("cls");
				del(list,count);
				break;
			case 6:
				clear(list, count);
				cout << "Выход" << endl;
				check = false;
				break;
			default:
				cout << "Ошибка ввода!" << endl;
				break;
			}
		}
	}

	void fillin(Person**& list, int& count)
	{	
		cin.clear();
		if (check_create)
		{
			for (int i = count-1; i < count; i++)
			{
				if (i>0)
				{
					while (check_nam)
					{
						cout << "Введите фамилию: ";
						cin >> list[i]->name;
						check_name(list,count,name,check_nam);						
					}
					check_nam = true;
				}
				else
				{
					cout << "Введите фамилию: ";
					cin >> list[i]->name;
					cin.clear();
				}
					
				cout << "Введите дату: " << endl;
				list[i]->data.read();
			}
		}
		else
		{
			cout << "\n***Создайте сначала список!***\n" << endl;
		}
	}

	bool create(Person**&list,bool & check_create, int &count)
	{		
		for (int i = 0; i < count; i++)
		{
			list[i] = new Person;
		}
		cout << "Список создан! В списке " << count << " персона" << endl;
		return check_create = true;
	}
	
	int add(Person** &list, int &count)
	{	
		if (check_create)
		{
			Person** list_new = new Person * [count + 1];
			for (int i = 0; i < count; i++)
			{
				list_new[i] = list[i];
			}
			count++;
			list_new[count - 1] = new Person;
			fillin(list_new, count);
			delete[]list;
			list = list_new;
			cout << "Персона добавлена" << "(+" << count - 1 << ")" << endl;
			return count;
		}
		else
		{
			cout << "\n***Создайте сначала список!***\n" << endl;
		}
	}
	int del(Person**& list, int& count)
	{
		if (check_create)
		{
			int number;
			cout << "Выберите кого необходимо удалить!(Введите порядковый номер)" << endl;
			show(list, count);
			cin >> number;
			Person** list_new = new Person * [count - 1];
			for (int i = 0; i < count; i++)
			{
				if (number == 1)
				{
					list_new[i] = list[i+1];
				}
				else if (i == (number - 1))
				{
					list_new[i - 1] = list[i];
				}
			}
			count--;
			delete[]list;
			list = list_new;			
			return count;
		}
		else
		{
			cout << "\n***Создайте сначала список!***\n" << endl;
		}		
	}
	
	void show(Person**& list, int& count)
	{
		if (check_create)
		{
			for (int i = 0; i < count; i++)
			{
				cout << i + 1 << ". Фамилия - " << list[i]->name;
				list[i]->data.display();
				cout << endl;
			}
		}
		else
		{
			cout << "\n***Создайте сначала список!***\n" << endl;
		}
	}
	void clear(Person**& list, int &count)
	{
		for (int i = 0; i < count; i++)
		{
			delete[]list[i];
		}
	}

private:
	std::string name;
	Date data;		
};
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
Adamos
@Adamos
Вы явно неправильно поняли задачу. Вам не нужно решать вопрос, вынесенный в заголовок.
Вам нужно написать класс-вектор и его наследника - Person.
Создавать вектор, содержащий указатели на Person, никто не просил.
Если это весь текст задания - могу предложить вам в качестве "подходящего типа" int.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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