С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 21.10.2015
Сообщений: 21

Связный список как часть друго класса

15.04.2016, 08:55. Показов 597. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет.
общая задача написать систему для управления колледжем с классами:
College, Department, Course, Student
у каждого объекта класса студент должен быть связный список содержащий указатели на курсы на которые записан студент а также у класса курс должен быть список адресов на объект студент, для студентов учащихся на данном курсе
решил сделать список как отдельный класс с использованием шаблона дабы функции работали для всех передаваемых в него классов.
классы департамент и колледж еще не написал, только два последних.
Так вот в чем проблема, когда все методы класса связного списка находятся в файле header всё отлично работает,
но как только переношу все методы в отдельный cpp файл начинает выдавать ошибку линкера.
далее приведён код header файла списка когда он работает и часть header класса студент как пример. в данном виде всё работает ка нужно.

List.h
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
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <iostream>
//////////////////////////
template <class T> class List
{
    struct Element
    {
        T* data;
        Element *next;        // указатель на следующий элемент списка
    };
 
    Element *first;           // указатель на первый элемент списка
    Element *last;           // указатель на последний элемент списка
    int countElem;            // количество элементов в списке
 
public:
    List()
{
    first = NULL;
    last = NULL;
    countElem = 0;
}
 
~List()
{
    while (first != NULL)
    {
        Element *pTemp = first;
        first = first->next;
        delete pTemp;
    }
}
 
 
void  add_front(T* data) //void(*)
{
    Element *temp = new Element;
 
    temp->next = first;
    first = temp;
    if (last == NULL)
        last = first;
    first->data = data;
    ++countElem;
}
 
 
 
void print()
{
 
    Element *pTemp = first;
 
    while (pTemp != NULL)
    {
        Course *print(pTemp->data);
        cout << print->getCourseName() << endl;
        pTemp = pTemp->next;
    }
}
 
bool IsEmpty()
{
    if (countElem == 0)
        return true;
    else
        return false;
}
 
bool removeItem(T* removeItem)
{
    Element *previous = NULL;
    Element *current = first;
    while (current != NULL)
    {
        if (current->data == removeItem)
        {
            if (previous != NULL)
                previous->next = current->next;
            if (current == last)
                last = previous;
            first = current;
            delete current;
            countElem--;
            return true;
        }
        else
        {
            previous = current;
            current = current->next;
        }
    }
    return false;
}
 
};
#endif;
student.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
enum gender {male=1,female=2,noGender=0};
using namespace std;
class Course;
class Student{
private:
    string Name;
    string ID;
    gender Gender;
    int Age;
    List<Course> StudentCourses; // создание списка 
    //LinkedList<Course> StudentCourses;
    int CourcesAmount;

а вот так не работает если изменить класс list.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class T> class List
{
    struct Element
    {
        T* data;
        Element *next;        // указатель на следующий элемент списка
    };
 
    Element *first;           // указатель на первый элемент списка
    Element *last;           // указатель на последний элемент списка
    int countElem;            // количество элементов в списке
 
public:
    List();
    ~List();
    void  add_front(T* data);
    void print();
    bool IsEmpty();
    bool removeItem(T* removeItem);
 
 
};
list.cpp
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
using namespace std;
template <class T>
List<T>::List()
{
    first = NULL;
    last = NULL;
    countElem = 0;
}
template <class T>
List<T>::~List()
{
    while (first != NULL)
    {
        Element *pTemp = first;
        first = first->next;
        delete pTemp;
    }
}
 
template <class T>
void  List<T>::add_front(T* data) //void(*)(const int&).
{
    Element *temp = new Element;
 
    temp->next = first;
    first = temp;
    if (last == NULL)
        last = first;
    first->data = data;
    ++countElem;
}
 
 
template <class T>
void List<T>::print()
{
 
    Element *pTemp = first;
 
    while (pTemp != NULL)
    {
        Course *print(pTemp->data);
        cout << print->getCourseName() << endl;
        pTemp = pTemp->next;
    }
}
 
template <class T>
bool List<T>::IsEmpty()
{
    if (countElem == 0)
        return true;
    else
        return false;
}
template <class T>
bool List<T>::removeItem(T* removeItem)
{
    Element *previous = NULL;
    Element *current = first;
    while (current != NULL)
    {
        if (current->data == removeItem)
        {
            if (previous != NULL)
                previous->next = current->next;
            if (current == last)
                last = previous;
            first = current;
            delete current;
            countElem--;
            return true;
        }
        else
        {
            previous = current;
            current = current->next;
        }
    }
    return false;
}
кричит что

C++
1
2
3
4
5
1>Student.obj : error LNK2019: unresolved external symbol "public: __thiscall List<class Course>::List<class Course>(void)" (??0?$List@VCourse@@@@QAE@XZ) referenced in function "public: __thiscall Student::Student(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,enum gender const &,int const &)" (??0Student@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0ABW4gender@@ABH@Z)
1>Student.obj : error LNK2019: unresolved external symbol "public: __thiscall List<class Course>::~List<class Course>(void)" (??1?$List@VCourse@@@@QAE@XZ) referenced in function "public: __thiscall Student::~Student(void)" (??1Student@@QAE@XZ)
1>Student.obj : error LNK2019: unresolved external symbol "public: void __thiscall List<class Course>::add_front(class Course *)" (?add_front@?$List@VCourse@@@@QAEXPAVCourse@@@Z) referenced in function "public: void __thiscall Student::operator+=(class Course *)" (??YStudent@@QAEXPAVCourse@@@Z)
1>Student.obj : error LNK2019: unresolved external symbol "public: void __thiscall List<class Course>::print(void)" (?print@?$List@VCourse@@@@QAEXXZ) referenced in function "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Student &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAVStudent@@@Z)
1>Student.obj : error LNK2019: unresolved external symbol "public: bool __thiscall List<class Course>::removeItem(class Course *)" (?removeItem@?$List@VCourse@@@@QAE_NPAVCourse@@@Z) referenced in function "public: bool __thiscall Student::operator-=(class Course *)" (??ZStudent@@QAE_NPAVCourse@@@Z)
помогите что я делаю не так при переносе методов в отдельный класс???
заранее спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2016, 08:55
Ответы с готовыми решениями:

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

Статические методы класса. (Связный список)
Добрый день, такая проблема, работаю со связным списком. Учусь. С обычными типами данных всё работает, решил с классами попробовать и с...

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

5
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.04.2016, 09:15
А все эти #ifndef и #include правильно расставлены?

Не по теме:

Что за noGender? Для тех самых? :)

0
1 / 1 / 0
Регистрация: 21.10.2015
Сообщений: 21
15.04.2016, 09:37  [ТС]
да вроде правельно,сейчас добавлю к кодам сверху их дефайны

p.s noGender для конструктора по умолчанию

Добавлено через 9 минут
не даёт редактировать,
в общем в файле LinkedList.cpp сверху есть только
C++
1
#include "LinkedList.h"
у класса LinkedList.h
C++
1
2
3
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <iostream>
student.h
C++
1
2
3
4
5
6
#ifndef STUDENT_H
#define STUDENT_H
 
#include "Course.h"
#include "LinkedList.h"
#include <string>
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
15.04.2016, 09:41
Alex Sil, шаблон должен быть полностью определен в заголовочном файле, разделять на .h и .cpp не надо.
Проще всего исправить, подключив файл с реализацией через include в конце заголовочного файла(перед endif)
0
1 / 1 / 0
Регистрация: 21.10.2015
Сообщений: 21
15.04.2016, 09:52  [ТС]
не очень понял, можно на примере пожалуйста? перед endif добавить #include"LinkedList.cpp" ???
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
21.04.2016, 02:54
Цитата Сообщение от Alex Sil Посмотреть сообщение
перед endif добавить #include"LinkedList.cpp" ???
Да, в файле LinkedList.h

Не по теме:

Извините, что долго не отвечал

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2016, 02:54
Помогаю со студенческими работами здесь

Конструктор копий для шаблонного класса(связный список)
Не совсем понятно как копировать объекты из динамической памяти, в частности правильная реализация конструктора копий. ...

Как заполнить связный список?
Доброго времени суток, уважаемые форумчане) Начал изучать С++, дошёл до связных списков и вот тут встала проблема... Я не понимаю как...

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru