Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Saiveen
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 17
1

Заполнить массив объектов базового класса

25.10.2016, 18:51. Просмотров 1969. Ответов 8
Метки нет (Все метки)

Суть задачи: есть базовый класс Участник и производные от него Студент и Школьник. Нужно заполнить массив объектов базового класса.

Краткая реализация:
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
================================
class Uchastnik
{
char name[20];
public:
Uchastnik(){}
virtual ~Uchastnik(){}
virtual void set()
{
std::cin>>name;
}
};
================================
class Student:public Uchastnik
{
char univer[20];
public:
Student(){}
~Student(){}
void set()
{
std::cin>>name;
std::cin>>univer;
}
};
================================
class School:Uchastnik
{
char nomer[20];
public:
School(){}
~School(){}
void set()
{
std::cin>>name;
std::cin>>nomer;
}
};
================================
//main.cpp
int main()
{
    Uchastnik **p = new Uchastnik*[2];
    p[0] = new School[5];
    p[1] = new Student[5];
    Uchastnik *uk;
    int i = 0;
 
    while (1)
    {
        char c;
        c=_getch();
        switch (c)
        {
        case '1':
        {
            uk = &p[1][i];
            uk->set();
            i++;
            break;
        }
    }
}
Проблема такая: первый объект успешно заполняется, а вот при попытке заполнения второго объекта, программа крашится, ругается на указатель _vfptr, якобы чтение памяти невозможно
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2016, 18:51
Ответы с готовыми решениями:

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" <<...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

Массив объектов класса. Печать строк-членов класса.
подскажите, как распечатать строки? #include "myString.h" #include <iostream> #define stop...

8
nd2
3090 / 2587 / 1131
Регистрация: 29.01.2016
Сообщений: 8,674
25.10.2016, 19:12 2
Цитата Сообщение от Saiveen Посмотреть сообщение
Краткая реализация:
Не компилируется.
0
Saiveen
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 17
25.10.2016, 19:20  [ТС] 3
Фулл код:

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <iomanip>
#include <Windows.h>
#include <conio.h>
using namespace std;
 
class Uchastnik
{
protected:
    char name[20], surname[20];
    int age;
public:
    Uchastnik();
    virtual ~Uchastnik();
    virtual void set();
    virtual void show();
};
 
class SchoolGuy :public Uchastnik
{
    char school[20];
public:
    SchoolGuy();
    ~SchoolGuy();
    void set();
    void show();
};
 
class Student :public Uchastnik
{
    char university[20];
public:
    Student();
    ~Student();
    void set()
    {
        cout << "Введите имя: ";
        cin >> name;
        cout << "\nВведите фамилию: ";
        cin >> surname;
        cout << "\nВведите возраст: ";
        cin >> age;
        cout << "\nВведите название ВУЗа: ";
        cin >> university;
    }
    void show()
    {
        cout << name << endl;
        cout << surname << endl;
        cout << age << endl;
        cout << university << endl;
    }
};
 
void Uchastnik::set()
{
    cout << "Введите имя: ";
    cin >> name;
    cout << "\nВведите фамилию: ";
    cin >> surname;
    cout << "\nВведите возраст: ";
    cin >> age;
}
 
void Uchastnik::show()
{
    cout << name << endl;
    cout << surname << endl;
    cout << age << endl;
}
 
Uchastnik::Uchastnik()
{
    name[0] = '\0';
    surname[0] = '\0';
    age = 0;
}
 
Uchastnik::~Uchastnik()
{
    cout << "Деструктор (Uchastnik)";
}
 
void SchoolGuy::set()
{
    cout << "Введите имя: ";
    cin >> name;
    cout << "\nВведите фамилию: ";
    cin >> surname;
    cout << "\nВведите возраст: ";
    cin >> age;
    cout << "\nВведите номер школы: ";
    cin >> school;
}
 
void SchoolGuy::show()
{
    cout << name << endl;
    cout << surname << endl;
    cout << age << endl;
    cout << school << endl;
}
 
SchoolGuy::SchoolGuy():Uchastnik()
{
    school[0] = '\0';
}
 
SchoolGuy::~SchoolGuy()
{
    cout << "Деструктор (SchoolGuy)";
}
 
Student::Student() :Uchastnik()
{
    university[0] = '\0';
}
 
Student::~Student()
{
    cout << "Деструктор (Student)";
}
 
char menu()
{
    char c;
    cout << "\t\t===Меню===" << endl
        << " 1)Добавить учащегося(студент)" << endl
        << " 2)Добавить учащегося(школьник)" << endl
        << " 3)Вывод всех данных на экран" << endl
        << " 4)Выход из программы";
    do
    {
        c = _getch();
    } while (!(c >= '1'&&c <= '5'));
    return c;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    Uchastnik **p = new Uchastnik*[2];
    p[0] = new SchoolGuy[5];
    p[1] = new Student[5];
    Uchastnik *uk;
    int i = 0;
    int b = 0;
 
    while (1)
    {
        system("cls");
        switch (menu())
        {
        case '1':
        {
            system("cls");
            uk = &p[1][i];
            uk->set();
            i++;
            break;
        }
        case '2':
        {
            system("cls");
            uk = &p[0][b];
            uk->set();
            b++;
            break;
        }
        case '3':
        {
            system("cls");
            if (i)
            {
                for (int a = 0; a < i; a++)
                {
                    uk = &p[1][a];
                    uk->show();
                }
            }
            if (b)
            {
                for (int a = 0; a < b; a++)
                {
                    uk = &p[0][a];
                    uk->show();
                }
            }
            _getch();
            break;
        }
        case '4':
        {
            system("cls");
            cout << "Работа программы завершена!";
            Sleep(1500);
            return 0;
        }
        }
    }
}
0
nd2
3090 / 2587 / 1131
Регистрация: 29.01.2016
Сообщений: 8,674
25.10.2016, 19:22 4
Цитата Сообщение от Saiveen Посмотреть сообщение
C++
1
class School:Uchastnik
Приватное наследование, или public пропустил?
Цитата Сообщение от Saiveen Посмотреть сообщение
Фулл код:
Вижу, что просто пропустил.
0
25.10.2016, 19:22
Saiveen
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 17
25.10.2016, 19:23  [ТС] 5
чуть выше весь код залил
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5272 / 2647 / 726
Регистрация: 18.10.2014
Сообщений: 4,658
25.10.2016, 19:48 6
Лучший ответ Сообщение было отмечено Saiveen как решение

Решение

Цитата Сообщение от Saiveen Посмотреть сообщение
программа крашится, ругается на указатель _vfptr,
Ваша программа пытается создать "полиморфные массивы"

C++
1
2
p[0] = new SchoolGuy[5];
p[1] = new Student[5];
В С++ нет полиморфных массивов. Если вам нужен массив с элементами, ведущими себя полиморфно, то создавайте массив указателей на полиморфные объекты, а не массив самих объектов.

То есть ошибка тут та же, что и вот в таком элементарном примере

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B
{
public:
  virtual void foo() {}
};
 
class D : public B
{
public:
  int i;
  virtual void foo() { i = 42; }
};
 
int main()
{
  B *base = new D[10];
  base[0].foo();       // <- это сработает
  base[5].foo();       // <- а вот тут неопределенное поведение, скорее всего краш 
}
2
Saiveen
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 17
25.10.2016, 20:34  [ТС] 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В С++ нет полиморфных массивов. Если вам нужен массив с элементами, ведущими себя полиморфно, то создавайте массив указателей на полиморфные объекты, а не массив самих объектов.
Суть в принципе понял, но как это можно реализовать?
Уже подумывал избавиться от виртуальных функций вовсе, но по заданию нужен массив объектов базового класса, а без виртуальных функций обратиться к соответствующему методу производного класса не получится
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5272 / 2647 / 726
Регистрация: 18.10.2014
Сообщений: 4,658
25.10.2016, 20:40 8
Цитата Сообщение от Saiveen Посмотреть сообщение
но по заданию нужен массив объектов базового класса,
У вас в коде делается попытка формирования двухмерного массива. Откуда взялась двухмерность?

"Массив объектов базового класса" является именно массивом объектов базового класса. Полиморфно он себя вести не будет. Если нужен "полиморфный" массив, то это должен быть именно массив указателей.
0
Saiveen
0 / 0 / 0
Регистрация: 03.11.2015
Сообщений: 17
25.10.2016, 20:43  [ТС] 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
У вас в коде делается попытка формирования двухмерного массива. Откуда взялась двухмерность?
Массив объектов базового класса, куда помещаются объекты и базового и производных классов.
Если же просто помещать объекты производного класса в элемент данного массива, то очевидно, данные производного теряются, отсюда и двумерный массив.
0
25.10.2016, 20:43
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2016, 20:43

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: ...

Написать класс Матрица. Массив объектов класса Массив
Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru