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

Шаблон двунаправленного списка

09.05.2017, 12:56. Показов 1493. Ответов 3
Метки нет (Все метки)

Добрый день! Пишу программу "библиотека", которая включает в себя типы данных Книга и Читатель соответственно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const int MAX_STRING_LENGTH = 30;
 
struct Book {
    int index;
    char author[MAX_STRING_LENGTH];
    char title[MAX_STRING_LENGTH];
    int price;
    int amount;
    char note[MAX_STRING_LENGTH];
};
 
struct Reader {
    int index;
    char surname[MAX_STRING_LENGTH];
    char name[MAX_STRING_LENGTH];
    int group;
    char phone[MAX_STRING_LENGTH];
    char email[MAX_STRING_LENGTH];
    char note[MAX_STRING_LENGTH];
};
При запуске программы данные о книгах и читателях должны считываться из файла в двунаправленные списки. Проблема заключается в создании шаблона списка, который будет подходить к каждой из вышеприведенных структур. Делаю его таким:

C++
1
2
3
4
5
6
template <class T>
struct List{
    T* data;
    List<T>* next;
    List<T>* previous;
};
Далее вызывает ошибки функция вывода элемента списка в консоль:

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
template <class T>
void show(List<T>* head) {
    system("cls");
    if (head == NULL) {
        if (typeid(T) == typeid(Book)) printf("Библиотека не имеет книг");
        else printf("Библиотека не имеет читателей");
        return;
    }
 
    head = moveToStart(head); //перемещение в начало списка
    if (typeid(T) == typeid(Book)) {
        printf("Книги:\n\n");
    }
    else {
        printf("Читатели:\n\n");
    }
 
    while (head->data != NULL) {
        if (typeid(T) == typeid(Book)) {
            showBook(head->data); //вывод информации о книге
        }
        else {
            showReader(head->data);//вывод информации о читателе
        }
        head = head->next;
    }
}
Ошибки следующие: (в VS 2015 код ошибки c2039) "surname",...,"email" не является членом "Book",
а также c2664 "void showReader(Reader*)": невозможно преобразовать аргумент 1 из "Book*" в "Reader*".

Подобная ошибка (Невозможно преобразовать Reader* в Book*) вызывается в функции добавления книг:

C++
1
2
3
4
5
6
7
8
9
10
11
12
List<T>* addNewBooks(List<T>* head, int* amount) {
    system("cls");
    do {
        T* data;                                                                              //Прототипы функций  
        if (typeid(T) == typeid(Book)) data = enteringBook(amount); //Book* enteringBook(int* amount);
        else data = enteringReader(amount);                                    //Reader* enteringReader(int* amount);
 
        head = addToList(data, head);//добавление элемента в список
        printf("\nНажмите любую клавишу для ввода следующей книги.\nНажмите Esc для возврата в меню");
    } while (_getch() != 27);
    return head;
}
В чем причина данных ошибок? Возможно ли вообще полностью реализовать данный шаблонный список, или же ничего не остается, как дублировать функции для двух отдельных списков с полями Book* и Reader*?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2017, 12:56
Ответы с готовыми решениями:

Получить указатель на элемент двунаправленного списка, добавить значение в начало списка и очистить его
Нужно создать двунаправленный список //вроде так, но не уверен struct Double_List {//структура...

Реализация Двунаправленного списка
Ребят, что он хочет от меня, ошибка компиляции, понять не могу в чем проблема, у меня еще просто...

Сортировка двунаправленного списка
Посоветуйте пожалуйста адекватный метод сортировки двунаправленного списка. Я сопсно вычитал на...

Удаление из двунаправленного списка
Программа компилируется, добавляет элементы в список, но когда доходит до удаления вылетает. ...

3
шКодер самоучка
2145 / 1856 / 907
Регистрация: 09.10.2013
Сообщений: 4,056
Записей в блоге: 7
09.05.2017, 16:19 2
Eg1, список является контейнером, а контейнер не должен знать деталей реализации хранимых в нем объектов.
Так что функции ввода/вывода должны быть вне контейнера.
Основные операции для списков - добавить элемент, удалить элемент, пройтись циклом по элементам.
0
0 / 0 / 0
Регистрация: 09.05.2017
Сообщений: 8
09.05.2017, 20:18  [ТС] 3
Спасибо за ответ. Но вопрос остается всё равно нерешенным. Дело в том, что мне нужно найти способ, как я смогу эти операции прописать один раз для двух списков, различающихся типом хранимых данных. Есть ли такая возможность в C++? Если есть, хотел бы получить какой-то намек, где это можно изучить.
0
шКодер самоучка
2145 / 1856 / 907
Регистрация: 09.10.2013
Сообщений: 4,056
Записей в блоге: 7
09.05.2017, 20:37 4
Eg1, есть наследование, виртуальные функции, но я думаю, что в вашем случае это не подойдет, так как объекты Book и Reader слишком разные.
Есть шаблонные функции - если немного доработать ваши структуры, то можно будет одной и той же функцией выводить элементы списков.
Но все равно вам нужно будет предоставить отдельную реализацию вывода для каждого типа элемента - от этого никуда не уйти.
+ операция добавления книги ведь может осуществляться только со списком книг. Так же и с "читателями".
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2017, 20:37

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

Очередь из двунаправленного списка
Вот мой двусвязный список : struct Num { int number; bool ring; Num *next, *prev; };...

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

Постраничный вывод записей двунаправленного списка
Здравствуйте! Проблема в чём - курсовик, постраничный вывод записей двунаправленного списка,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru