Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 22.05.2021
Сообщений: 16
1

Присвоение производных классов в массив родительского класса

19.12.2021, 11:11. Показов 645. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть родительский класс Human и два производных. Когда хочу присвоить элементу массива Human например Student ( my_array[write_counter] = new Student(write_counter, 2, "aa", "dd", 4, 6, "gf")), выдаёт ошибку: [bcc32c Error] Unit3.cpp(101): no viable overloaded '='
Unit3.h(74): candidate function (the implicit move assignment operator) not viable: no known conversion from 'Student *' to 'Human' for 1st argument; dereference the argument with *
Unit3.h(74): candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Student *' to 'const Human' for 1st argument; dereference the argument with *

Подскажите, пожалуйста, как быть? (Требуется всё хранить именно в массиве, не в векторе)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
class Human {
 
private:
int number;
int age;
AnsiString name;
AnsiString surname;
 
public:
 
int get_number () {return(number);}
void set_number (int number_in) {number = number_in;}
 
int get_age () {return(age);}
void set_age (int age_in) {age = age_in;}
 
AnsiString get_name () {return(name);}
void set_name (string name_in) {name = name_in;}
 
AnsiString get_surname () {return(surname);}
void set_surname (string surname_in) {surname = surname_in;}
 
//------------------------------------------------------------------------------
 
Human();
Human(int Number, int Age, AnsiString Name, AnsiString Surname);
 
 
};
 
 
class Student : public Human{
 
private:
int group;
int course;
AnsiString specialization;
 
public:
 
int get_group () {return(group);}
void set_group (int group_in) {group = group_in;}
 
int get_course () {return(course);}
void set_course (int course_in) {course = course_in;}
 
AnsiString get_specialization () {return(specialization);}
void set_specialization (string specialization_in) {specialization = specialization_in;}
 
//------------------------------------------------------------------------------
 
Student();
 
Student(int Number, int Age, AnsiString Name, AnsiString Surname,
            int Group, int Course, AnsiString Specialization);
 
};
 
 
class Teacher : public Human{
 
private:
int experience;
AnsiString degree;
AnsiString subject;
 
public:
 
int get_experience () {return(experience);}
void set_experience (int experience_in) {experience = experience_in;}
 
AnsiString get_degree () {return(degree);}
void set_degree (string degree_in) {degree = degree_in;}
 
AnsiString get_subject () {return(subject);}
void set_subject (string subject_in) {subject = subject_in;}
 
//------------------------------------------------------------------------------
 
Teacher(int Number, int Age, AnsiString Name, AnsiString Surname,
            int Experience, AnsiString Degree, AnsiString Subject);
 
};


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <vcl.h>
#pragma hdrstop
 
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
 
#include <string>
#include <iostream>
#include <iomanip>
 
//------------------------------------------------------------------------------
 
int write_counter = 0;
Human *my_array = new Human[write_counter];
 
//---------------------------------------------------------------------------
 
Human::Human(){
number = -1;
age = 0;
name = "";
surname = "";
};
 
Human::Human(int Number, int Age, AnsiString Name, AnsiString Surname){
 
number = Number;
age = Age;
name = Name;
surname = Surname;
 
}
 
Student::Student():Human(){
 
group = 1;
course = 1;
specialization  = "dddd";
};
 
Student::Student(int Number, int Age, AnsiString Name,
         AnsiString Surname, int Group, int Course, AnsiString Specialization) :
         Human(Number, Age, Name, Surname){
 
group = Group;
course = Course;
specialization = Specialization;
 
};
 
Teacher::Teacher(int Number, int Age, AnsiString Name, AnsiString Surname,
         int Experience, AnsiString Degree, AnsiString Subject):
         Human(Number, Age, Name, Surname){
 
experience = Experience;
degree = Degree;
subject = Subject;
 
};
 
 
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm3::Button_AddClick(TObject *Sender)
{
 
write_counter++;
 
Human *newArray = new Human[write_counter];
 
for (int i = 0; i < write_counter - 1; i++)
{
newArray[i] = my_array[i];
}
 
delete[] my_array;
 
my_array = newArray;
 
if (Check_Student->Checked) {
 
    my_array[write_counter] = new Student(write_counter, 2,
              "aa", "dd",  4,
                 6, "gf");
}
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2021, 11:11
Ответы с готовыми решениями:

Занести из файла объекты производных классов в массив объектов базового класса
Здравствуйте. Что в этом коде изменить, чтобы объекты производных классов заносились из файла?...

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в...

Как сделать, чтобы производный класс наследовал все операторы от родительского класса и от родительского родительского
Есть 1й базовый класс в кот. определён operator ++ (); //prefix Есть производный от 1го, 2й класс...

Вызов одноименных функций классов наследников из родительского класса
Как вызвать функцию классов наследников из родительского класса. Нужно что бы было универсальное...

4
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
19.12.2021, 11:20 2
Цитата Сообщение от kolosl Посмотреть сообщение
Подскажите, пожалуйста, как быть?
У вас "массив" хранит объекты типа Human(что не корректно для вашей задачи), а вы пытаетесь туда засунуть объект типа Human*. Измените тип элементов массива.
А еще, ваша иерархия классов не предоставляет никакой возможности определить динамический тип объектов. Задача, наверное, на полиморфизм.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
19.12.2021, 11:23 3
Лучший ответ Сообщение было отмечено kolosl как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm3::Button_AddClick(TObject *Sender)
{
   write_counter++;
   Human **newArray = new Human*[write_counter]; // массив УКАЗАТЕЛЕЙ на базовый класс
   for (int i = 0; i < write_counter - 1; i++)
         newArray[i] = my_array[i];  // my_array тоже должен быть массив УКАЗАТЕЛЕЙ на базовый класс
   delete[] my_array;
   my_array = newArray;
   if (Check_Student->Checked) {
         my_array[write_counter] = new Student(write_counter, 2,"aa", "dd",  4, 6, "gf");
}
}
C++
1
Human **my_array = new Human*[write_counter];  // массив УКАЗАТЕЛЕЙ на базовый класс
p.s. При завершении программы нужно удалить все созданные элементы,
а потом удалить массив указателей.
1
0 / 0 / 0
Регистрация: 22.05.2021
Сообщений: 16
19.12.2021, 11:57  [ТС] 4
Спасибо, запустилось. А при такой реализации смогу ли я обращаться к методам класса Student?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
19.12.2021, 12:43 5
Цитата Сообщение от kolosl Посмотреть сообщение
обращаться к методам класса Student
Приведите указатель к типу Student и вызывайте
C++
1
static_cast<Student*>(my_array[i])->get_specialization();
0
19.12.2021, 12:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2021, 12:43
Помогаю со студенческими работами здесь

Массив производных классов
Скажите пожалуйста или дайте ссылку/пример, где можно почитать (мною найдено не было) как на...

Возможно ли некоторые публичные члены базового класса закрыть для производных классов?
Т.е. чтобы некоторые члены были доступны из экземпляра базового класса, но чтобы их невозможно было...

Массив объектов разных производных классов
Задача такая: базовый класс - фигура, производные классы - круг, треугольник и т.п. Пользователь...

Доступ к методу родительского класса из метода свойства родительского класса
Не знаю правильно ли написал тему, ну суть такая, есть класс который описывает допустим шарик, а...

Абстрактный класс, массив указателей на объекты производных классов
У меня есть абстрактный класс: class abstract{ public: int field; double method(); }; В...

Создать массив в базовом абстрактном классе, и его передать функциям производных классов
есть полностью абстрактный (виртуальный) класс. там все функции виртуальные и равны 0. Назовем его...

Наследование, массив объектов дочернего класса внутри родительского
Всем доброго времени суток, нигде не смогла найти ответа на этот вопрос. Я создала несколько...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru