Форум программистов, компьютерный форум, киберфорум
Наши страницы

Наследование и связный список - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не могу найти ошибку в массиве http://www.cyberforum.ru/cpp-beginners/thread1010365.html
Добрый вечер. Никак не могу найти ошибку. Спасибо за помощь # include <iostream> # include <math.h> # include <conio.h> # include <stdio.h> using namespace std; int main() {...
C++ Строки и работа с файлами Дан текст в файле input.txt. Проверяет чтобы после каждой точки предложение начиналось с большой буквы.Корректный текст записывает в файл output.txt.Корректно преобразует только первую строку.Но если... http://www.cyberforum.ru/cpp-beginners/thread1010358.html
C++ Одинаковые цифры в числах
Введите два числа А и В. Проверьте, есть ли у них одинаковые цифры. Даже не понимаю, с какой стороны подходить к программе.
C++ Матрицы на с++
В университете задали задачу: Заменить знак на противоположный в элементах матрицы, A=(a), i=j=1,2,...m, которые размещены в рядках и начинаются с отрицательных элементов. Посчитать питомый вес...
C++ Удаление одинаковы строк http://www.cyberforum.ru/cpp-beginners/thread1010316.html
Допустим у меня есть строка s и я хочу удалить одинаковые подстроки в ней. Сначала я извлекаю подстроки до символа '\n' из s с помощью функции read_line. При первом вызове этой функции я получу subs...
C++ Многомерные массивы (матрицы) Не могу понять как написать код. Если не сложно напишите подробнее цикл. Вот начало. srand(time(NULL)); const int SIZE = 7; int A; int sum = 0; for (int y=0;... подробнее

Показать сообщение отдельно
Laix
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 64

Наследование и связный список - C++

17.11.2013, 20:31. Просмотров 374. Ответов 4
Метки (Все метки)

Пытаюсь сделать связный список, используя наследование при этом.
Есть класс Person - имя, и указатель на следующий элемент, операция копирования(чтобы не юзабельна была) и функция добавления в список - все под private, дабы не использовалось во вред. Под public - статическая переменная под голову списка(list_begin), конструктор, вирт деструктор, виртуальная функция и вспомогательные.
Далее 3 класса-наследника с переопределением виртуальной функции(show).

Программа компилируется, но на этапе выполнения после первого getch() появляется ошибка:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Error!

Program: ...aix\documents\visual studio 2012\Projects\тест\Debug\тест.exe

HEAP CORRUPTION DETECTED: after Normal block (#333) at 0x00508A58.
CRT detected that the application wrote to memory after end of heap buffer.


(Press Retry to debug the application)

---------------------------
Прервать Повтор Пропустить
---------------------------
Мой английский помог мне понять, что ошибка где то в динамическом выделении памяти, но устранить я её не смог =(.

Код программы:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <conio.h>
#include <clocale>
 
using namespace std;
 
 
class Person
{
    private:
        char* name;
        Person* next;
        
        Person& operator=( const Person& ); //
        void add();
    public:     
        static Person* list_begin;
        char* getname();
    
        Person( char* );
        virtual ~Person() { delete name; }
        virtual void show() = 0;
        static void print_list();
        static void clean_list();
};
 
 
class Manager : public Person
{
    protected:
        char* work_place;
        
    public:
        Manager( char * n, char* wplace ) : Person(n)
        {
            work_place = new char[strlen(n)+1];
            strcpy( work_place, wplace );
        }
        ~Manager() { delete work_place; }
        
        void show();
};
 
class Worker : public Person
{
    protected:
        int experience;
    
    public:
        Worker( char* n, int e ) : experience(e), Person(n)
        {   }
        ~Worker() { }
        
        void show();
};
 
class Engineer : public Person
{
    protected:
        char* education;
    
    public:
        Engineer( char* n, char* edu ) : Person(n)
        {
            education = new char[strlen(edu)+1];
            strcpy( education, edu );
        }
        ~Engineer() { delete education; }
        
        void show();
};
 
 
//-------------
Person::Person(char* n)
{
    name = new char[strlen(n)+1];
    strcpy(name , n);
    next = 0;
    add();
}
 
char* Person::getname()
{
    return name;
}
 
void Person::add()
{
    if( list_begin == 0 )
            list_begin = this;
    else
        {
            Person* last = list_begin;
            while( last->next != 0 )
                last = last->next;
            last->next = this;
        }
}
 
void Person::print_list()
{
    Person* temp = list_begin;
    int i = 0;
    while( temp != 0 )
        {
            temp->show();
            i++;
            temp = temp->next;
        }
}
 
void Person::clean_list()
{
    Person* temp = list_begin;
    while( temp != 0 )
        {
            Person* deleteme = temp;
            temp = temp->next;
            delete deleteme;
        }
    list_begin = 0;
}
 
void Manager::show()
{
    cout<<"\n->Manager."<<endl;
    cout<<"  Name: "<<getname()<<endl;
    cout<<"  Work place: "<<work_place<<endl;
}
 
void Worker::show()
{
    cout<<"\n->Worker."<<endl;
    cout<<"  Name: "<<getname()<<endl;
    cout<<"  Experience: "<<experience<<endl;
}
 
void Engineer::show()
{
    cout<<"\n->Engineer."<<endl;
    cout<<"  Name: "<<getname()<<endl;
    cout<<"  Education: "<<education<<endl;
}
//----------------------------------------------------
Person* Person::list_begin = NULL;
 
int main()
{
    setlocale(LC_ALL, "rus");
    
 
    Engineer A("Александров К.Е.","Высшее");
    Manager B("Петров Е.Т.","Отдел кадров");
    Worker C("Рыбаков Е.Р.", 6);
 
    Person::print_list();
    getch();
 
    //Person::clean_list();
    //getch();
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru