Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
1

Связный список объектов

29.04.2013, 16:03. Просмотров 1179. Ответов 9
Метки нет (Все метки)

Добрый день, необходимо было реализовать иерархию кадры, администрация, инженер, рабочий и
Определить в классе статическую компоненту - указатель на начало связанного списка объектов и статическую функцию для просмотра списка.
Я сделал все классы наследниками от кадров, в список объекты получается добавить, но при удалении или вызове деструктора вылетает ошибка, помогите пож-та найти проблему. Это базовый абстрактный класс:
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
#include <iostream>
#include "Staff.h"
 
using namespace std;
 
Staff * Staff :: begin = 0;
Staff * Staff :: end = 0;
 
Staff :: Staff() {
    name = 0;
    surname = 0;
    experience = 0;
    next = 0;
}
 
Staff :: Staff(char *name, char *surname, int experience) {
    this -> name = new char[strlen(name) + 1];
    strcpy(this -> name, name);
    this -> surname = new char[strlen(surname) + 1];
    strcpy(this -> surname, surname);
    this -> experience = experience > 0 ? experience : 0;
    next = 0;
}
 
Staff :: ~Staff() {
    delete [] name;
    delete [] surname;
 
    if (!isEmpty()) {
        Staff *currentPtr = begin, *tempPtr;
        while (currentPtr != 0) {
            tempPtr = currentPtr;
            currentPtr = currentPtr -> next;
            delete tempPtr;     
        }
    }       
}
 
int Staff :: isEmpty() {
    return begin == 0;
}
 
void Staff :: printElements() {
    if (isEmpty()) {
        cout << "List is empty\n";
        return;
    }
 
    Staff *tempPtr = begin;
    while (tempPtr != 0) {
        tempPtr -> printData();
        tempPtr = tempPtr -> next;
    }
}
 
void Staff :: addElement() {
    if (isEmpty())
        begin = end = this;
    else {
        this -> next = begin;
        begin = this;
    }
}
 
int Staff :: deleteElement() {
    if (isEmpty())
        return 0;
    else {
        Staff *tempPtr = begin;
        if (begin == end)
            begin = end = 0;
        else 
            begin = begin -> next;
        delete tempPtr;
        return 1;
    }
}
Поле next - сделал нестатическим protected. Может быть я неправильно понял, как нужно создавать список, поправьте, если я сделал ошибку, заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2013, 16:03
Ответы с готовыми решениями:

Упорядоченный связный список объектов класса
Добрый вечер, вот уже третий день бьюсь в попытках создания связного списка из объектов класса....

Связный список (Используя структуру описания даты, построить связный список студентов, сформированный в алфавитном порядке)
Здраствуйте! Помогите пожалуйста найти косяк. Выводится только первая строчка из списка студентов....

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

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

9
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.04.2013, 16:08 2
Kreativ, деструктор виртуальный? И я бы рекомендовал Вам использовать std::string вместо char*.
1
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
29.04.2013, 16:15  [ТС] 3
да, деструктор виртуальный, std :: string можно конечно, правда навряд ли там кроется ошибка, но сейчас попробую изменить
0
667 / 195 / 29
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 16:24 4
C++
1
2
3
4
while (tempPtr) { // != 0 лучше заменить на != NULL, либо вот так, может поможет
        tempPtr -> printData();
        tempPtr = tempPtr -> next;
    }
Добавлено через 2 минуты
замените везде 0 на NULL, когда к объектам применяется
0
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
29.04.2013, 16:31  [ТС] 5
заменил везде, не помогло ( . Начал отладку, в мэйне:
C++
1
2
3
Engineer obj1("Kino", "Kino", 20, 10.2, 3);
obj1.addElement();
obj1.deleteElement();
зашел в метод :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int Staff :: deleteElement() {
    if (isEmpty())
        return 0;
    else {
        Staff *tempPtr = begin;
        if (begin == end)
            begin = end = 0;
        else 
            begin = begin -> next;
        delete tempPtr;
        return 1;
    }
}
на строке delete tempPtr; значение tempPtr правильное, хранит тот объект который нужно удалить, после выполнения строки прога просто зависла. Попробовал убрать в мэйне строку удаления совсем чтобы деструктор сам вызвался, вот в нем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Staff :: ~Staff() {
    delete [] name;
    delete [] surname;
 
    if (!isEmpty()) {
        Staff *currentPtr = begin, *tempPtr;
        while (currentPtr != 0) {
            tempPtr = currentPtr;
            currentPtr = currentPtr -> next;
            delete tempPtr;     
        }
    }       
}
переменная begin не хранит значение объекта, который должен там быть по идее, хотя пошагово проверил addElement() там begin проинициализировался правильно, не понимаю в чем ошибка
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.04.2013, 16:34 6
Kreativ, а std::list вообще можно использовать?
0
667 / 195 / 29
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 16:34 7
Kreativ, дайте кусочек кода, где вы создаёте этот объект и удаляете. Там где ошибка у вас, я оттдебажу.
0
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
29.04.2013, 19:26  [ТС] 8
Цитата Сообщение от Tulosba Посмотреть сообщение
Kreativ, а std::list вообще можно использовать?
узнал у одногруппника, нет нельзя (

Цитата Сообщение от Ternsip Посмотреть сообщение
Kreativ, дайте кусочек кода, где вы создаёте этот объект и удаляете. Там где ошибка у вас, я оттдебажу.
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
#include <iostream>
#include "Engineer.h"
#include "Staff.h"
#include "Worker.h"
 
using namespace std;
int main() {
        Engineer obj1("Lev", "Lev", 20, 10.2, 3);
    Worker obj2("Sobaka", "Sobaka", 10, 9.9, 4);
    Engineer obj3("Kot", "Kot", 20, 9.9, 2);
    Worker obj4("Ptica", "Ptica", 15, 2.3, 1);
 
    obj1.addElement();
    obj2.addElement();
    obj3.addElement();
    obj4.addElement();
 
    Staff :: printElements();
 
    obj1.deleteElement();
    
    cout << "asdasd" << endl;   
        return 0;
}
Добавлено через 2 часа 39 минут
эх, неужели никто не сможет помочь
0
667 / 195 / 29
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 21:19 9
Kreativ, залей .h файлы плз
C++
1
2
3
#include "Engineer.h"
#include "Staff.h"
#include "Worker.h"
вот эти
0
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
29.04.2013, 21:42  [ТС] 10
архив
0
Вложения
Тип файла: rar Lab2.rar (2.4 Кб, 23 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2013, 21:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Связный список
Здравствуйте. Подскажите информацию насчет связных списков. Книгу, или сайтик.

Связный список
Создать связанный список целых чисел, расположенных по возрастанию. Включить в список три числа, не...

Связный список
Не получается нормально скомпоновать файлы :( Сделал связный список использую шаблоны класса. Файл...


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

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

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