0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
1

Реализация шаблона класса дек

06.04.2020, 16:03. Показов 6874. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Не могу уже долгое время понять в чём проблема: нужно чтобы шаблон класса дек взаимодействовал с классом Abiturient, т.е чтобы можно было, например, заполнять/выводить элементы класса Abiturient с помощью дека. Уверен, что ошибка лежит на поверхности, но не получается исправить её.

Файл deque.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
#ifndef  DEQUE_H
#define DEQUE_H
 
#include <iostream>
#include "abiturient.h"
 
using namespace std;
 
template <class T> struct Node
{
    T Data;
    Node<T>* Next;
    Node<T>* Prev;
    Node(T* data)
    {
        this->Data = data;
        Next = NULL;
        Prev = NULL;
    }
};
 
template <class T> 
class Deque : public Abiturient
{
    Node<T>* head;
public:
    int size;
    void push_front(T*);
    T pop_front();
    void push_back(T*);
    T pop_back();
    const T peek();
    const bool isEmpty();
    Deque<T>& operator= (const Deque&);
    template <class U>
    friend ostream& operator<< (ostream&, const Deque<U>&);
    template <class T>
    friend class Iterator;
};
template <class T>
class Iterator
{
    Deque<T>* D;
    Node<T>* current;
public:
    // Конструктор преобразования
    Iterator(Deque<T>& obj)
    {
        D = &obj;
        current = obj.head;
    }
    // Возвращает текущий объект дека без его удаления
    int peek() {
        return current->Data;
    }
    // Переходит к следующему объекту дека
    void next() {
        current = current->Next;
    }
    // Переходит к предыдущему объекту дека
    void prev() {
        current = current->Prev;
    }
    // Переходит в начало дека
    void reset() {
        current = D->head;
    }
    // Проверяет существует ли элемент
    const bool isEmptyElement() {
        if (!current)
            return true;
        else
            return false;
    }
    // Доступ к элементу по адресу
    void set(Node<T>* p = 0) {
        current = p;
    }
};
#endif
Файл deque.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
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
#include "deque.h"
 
template <class T>
void Deque<T>::push_front(T* data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* temp = new Node<T>(data);
        temp->Next = head;
        head->Prev = temp;
        head = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в начале дека
template <class T>
T Deque<T>::pop_front()
{
    if (head)
    {
        int temp = head->Data;
        Node<T>* p = head;
        head = p->Next;
        delete[] p;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Вставляет объект как нижний элемент дека
template <class T>
void Deque<T>::push_back(T* data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        Node<T>* temp = new Node<T>(data);
        tail->Next = temp;
        temp->Prev = tail;
        tail = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в конце дека
template <class T>
T Deque<T>::pop_back()
{
    if (head)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        T temp = tail->Data;
        Node<T>* p = tail;
        tail = p->Prev;
        tail->Next = NULL;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Возвращает объект в верхней части дека без его удаления
template <class T>
const T Deque<T>::peek()
{
    if (head)
        return head->Data;
    else
        return 0;
}
// Проверяет пуст ли дек
template <class T>
const bool Deque<T>::isEmpty() {
    return size == 0;
}
// Перегрузка оператора присваивания
template <class T>
Deque<T>& Deque<T>::operator= (const Deque& obj)
{
    if (this == &obj)
        return *this;
    if (!obj.head)
        return *this;
    head = new Node<T>(obj.head->Data);
    Node<T>* temp = obj.head->Next;
    Node<T>* pnew = 0;
    Node<T>* pold = head;
    while (temp)
    {
        pnew = new Node<T>(temp->Data);
        pnew->Prev = pold;
        pold->Next = pnew;
        pold = pnew;
        temp = temp->Next;
    }
    return *this;
}
// Перегрузка потокового поератора вывода
template <class T>
ostream& operator<<(ostream& os, const Deque<T>& obj)
{
    for (Node<T>* i = obj.head; i != NULL; i = i->Next)
        os << i->Data << " ";
    return os;
}
Файл abiturient.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
#ifndef ABITURIENT_H
#define ABITURIENT_H
 
#include <iostream>
#include <string>
 
using namespace std;
 
class Abiturient
{
private:
    int number;
    string fio;
    string address;
    float average;
    int markMath;
    int markRus;
    int markPhys;
public:
    Abiturient();
    Abiturient(const Abiturient& cop);
    Abiturient(int number, string fio, string adress, float average, int markmath, int markrus, int markphys);
    void setNumber(int abiturientNumber);
    int getNumber();
    void setFio(string abiturientName);
    string getFio();
    void setAddress(string abiturientAddress);
    string getAddress();
    void setAverage(float abiturientAverage);
    float getAverage();
    void setMarkMath(int abiturientMarkMath);
    int getMarkMath();
    void setMarkRus(int abiturientMarkRus);
    int getMarkRus();
    void setMarkPhys(int abiturientMarkPhys);
    int getmarkPhys();
    friend ostream& operator<<(ostream& Cout, Abiturient* test);
};
#endif
Файл abiturient.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
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
#include "abiturient.h"
 
Abiturient::Abiturient()
{
    this->number = 0;
    this->fio = "";
    this->address = "";
    this->average = 0.0;
    this->markMath = 0;
    this->markRus = 0;
    this->markPhys = 0;
}
 
Abiturient::Abiturient(const Abiturient& cop)
{
    this->number = cop.number;
    this->fio = cop.fio;
    this->address = cop.address;
    this->average = cop.average;
    this->markMath = cop.markMath;
    this->markRus = cop.markRus;
    this->markPhys = cop.markPhys;
}
 
Abiturient::Abiturient(int number, string fio, string adress, float average, int markmath, int markrus, int markphys)
{
    this->number = number;
    this->fio = fio;
    this->address = adress;
    this->average = average;
    this->markMath = markmath;
    this->markRus = markrus;
    this->markPhys = markphys;
}
 
void Abiturient::setNumber(int abiturientNumber)
{
    number = abiturientNumber;
}
 
int Abiturient::getNumber()
{
    return number;
}
 
void Abiturient::setFio(string abiturientName)
{
    fio = abiturientName;
}
 
string Abiturient::getFio()
{
    return fio;
}
 
void Abiturient::setAddress(string abiturientAddress)
{
    address = abiturientAddress;
}
 
string Abiturient::getAddress()
{
    return address;
}
 
void Abiturient::setAverage(float abiturientAverage)
{
    average = abiturientAverage;
}
 
float Abiturient::getAverage()
{
    return average;
}
 
void Abiturient::setMarkMath(int abiturientMarkMath)
{
    markMath = abiturientMarkMath;
}
 
int Abiturient::getMarkMath()
{
    return markMath;
}
void Abiturient::setMarkRus(int abiturientMarkRus)
{
    markRus = abiturientMarkRus;
}
 
int Abiturient::getMarkRus()
{
    return markRus;
}
 
void Abiturient::setMarkPhys(int abiturientMarkPhys)
{
    markPhys = abiturientMarkPhys;
}
 
int Abiturient:: getmarkPhys()
{
    return markPhys;
}
 
ostream& operator<<(ostream& Cout, Abiturient* test)
{
    string temp = "Номер: ";
    temp += to_string(test->getNumber());
    temp += ", ФИО: ";
    temp += test->getFio();
    temp += ", Адрес: ";
    temp += test->getAddress();
    temp += " , Средний балл абитуриента: ";
    temp += to_string(test->getAverage());
    temp += ", Оценка по математике: ";
    temp += to_string(test->getMarkMath());
    temp += ", Оценка по русскому: ";
    temp += to_string(test->getMarkRus());
    temp += ", Оценка по физике: ";
    temp += to_string(test->getmarkPhys());
    Cout << temp;
    return Cout;
}
Главный файл source.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <Windows.h>
#include "abiturient.h"
#include "deque.h"
 
using namespace std;
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    Deque <Abiturient> abiturient;
 
    Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
 
    abiturient.push_front(abit);
    
    return 0;
}
Ошибка 1: Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка LNK2019 ссылка на неразрешенный внешний символ "public: void __thiscall Deque<class Abiturient>:ush_front(class Abiturient *)" (?push_front@?$Deque@VAbiturient@@@@QAEXPAVAbiturient@@@Z) в функции _main Project2 D:\ООП\Lr4_2\Project2\Project2\Source.obj

Ошибка 2: Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка LNK2019 ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<<class Abiturient>(class std::basic_ostream<char,struct std::char_traits<char> > &,class Deque<class Abiturient> const &)" (??$?6VAbiturient@@@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV ?$Deque@VAbiturient@@@@@Z) в функции _main Project2 D:\ООП\Lr4_2\Project2\Project2\Source.obj

Заранее извиняюсь, если неправильно оформил тему.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2020, 16:03
Ответы с готовыми решениями:

Реализация шаблона класса
Большая-пребольшая просьба, помогите, пожалуйста, с решением данной задачи. Саму задачу реализовать...

Реализация шаблона класса char
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;string&gt; using namespace std; char a; int...

Программная реализация класса обработки одномерного массива с использованием шаблона
Описать класс Array обработки одномерных массивов произвольного размера и типа. Использовать...

Программная реализация класса обработки одномерного массива с использованием шаблона
Описать класс Array обработки одномерных массивов произвольного размера и типа. Использовать шаблон...

17
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 18:04 2
Лучший ответ Сообщение было отмечено _Beginner_ как решение

Решение

Цитата Сообщение от _Beginner_ Посмотреть сообщение
Здравствуйте. Не могу уже долгое время понять в чём проблема: нужно чтобы шаблон класса дек взаимодействовал с классом Abiturient, т.е чтобы можно было, например, заполнять/выводить элементы класса Abiturient с помощью дека. Уверен, что ошибка лежит на поверхности, но не получается исправить её.
C++
1
2
3
4
5
template <class T> 
class Deque
{
    Node<T>* head;
public:
Добавлено через 55 секунд
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Главный файл source.cpp
C++
1
2
3
4
5
    Deque <Abiturient *> abiturient;
 
    Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
 
    abiturient.push_front(abit);
Добавлено через 40 секунд
Либо
C++
1
2
    Deque <Abiturient> abiturient;
    abiturient.push_front(Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2));
Добавлено через 2 минуты
Цитата Сообщение от _Beginner_ Посмотреть сообщение
template <class T>
void Deque<T>:ush_front(T* data)
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T> struct Node
{
    T Data;
    Node<T>* Next;
    Node<T>* Prev;
    Node(const T &data)
: Data(data)
, Next(nullptr)
, Prev(nullptr)
    {
    }
};
Добавлено через 1 минуту
C++
1
2
3
    void push_front(const T &);
    T pop_front();
    void push_back(const T &);
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 19:13  [ТС] 3
Спасибо за ответ, всё поменял, но остались ошибки:
1-ая: Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка LNK2019 ссылка на неразрешенный внешний символ "public: void __thiscall Deque<class Abiturient *>:ush_front(class Abiturient * const &)" (?push_front@?$Deque@PAVAbiturient@@@@QAEXABQAVAbiturient@@@Z) в функции _main Project2 D:\ООП\Lr4_2\Project2\Project2\Source.obj 1
2-ая: Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка LNK2019 ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<<class Abiturient *>(class std::basic_ostream<char,struct std::char_traits<char> > &,class Deque<class Abiturient *> const &)" (??$?6PAVAbiturient@@@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@A BV?$Deque@PAVAbiturient@@@@@Z) в функции _main Project2 D:\ООП\Lr4_2\Project2\Project2\Source.obj
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 19:16 4
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Спасибо за ответ, всё поменял, но остались ошибки:
Покажи как сделал

Добавлено через 1 минуту
Цитата Сообщение от _Beginner_ Посмотреть сообщение
// Перегрузка потокового поератора вывода
template <class T>
ostream& operator<<(ostream& os, const Deque<T>& obj)
{
    for (Node<T>* i = obj.head; i != NULL; i = i->Next)
        os << i->Data << " ";
    return os;
}
Убери этот оператор, здесь он не нужен
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 19:16  [ТС] 5
C++
1
2
3
4
5
6
Deque <Abiturient*> abiturient;
 
    Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
 
    abiturient.push_front(abit);
    cout << abiturient;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class T> 
class Deque
{
    Node<T>* head;
public:
    int size;
    void push_front(const T&);
    T pop_front();
    void push_back(const T&);
    T pop_back();
    const T peek();
    const bool isEmpty();
    Deque<T>& operator= (const Deque&);
    template <class U>
    friend ostream& operator<< (ostream&, const Deque<U>&);
    template <class T>
    friend class Iterator;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T> struct Node
{
    T Data;
    Node<T>* Next;
    Node<T>* Prev;
    Node(const T &data)
    {
        this->Data = data;
        Next = nullptr;
        Prev = nullptr;
    }
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <class T>
void Deque<T>::push_front(const T &data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* temp = new Node<T>(data);
        temp->Next = head;
        head->Prev = temp;
        head = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T>
void Deque<T>::push_back(const T &data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        Node<T>* temp = new Node<T>(data);
        tail->Next = temp;
        temp->Prev = tail;
        tail = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 19:17 6
Либо сделай оператор специально для Abiturient *
C++
1
ostream& operator<<(ostream& os, Abiturient *obj)
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 19:22  [ТС] 7
Без перегруженного оператора вывода не может скомпилить cout << abiturient;, т.к выдаёт ошибку:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "Deque<Abiturient *>" (или приемлемое преобразование отсутствует) Project2 D:\ООП\Lr4_2\Project2\Project2\Source.cpp 20
И если специально для Abiturient сделать, то также
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 19:23 8
Цитата Сообщение от _Beginner_ Посмотреть сообщение
И если специально для Abiturient сделать, то также
Для указателя сделай сonst Abiturient *
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 19:25  [ТС] 9
Тоже самое
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 19:35 10
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Файл deque.cpp
Перенеси все функции отсюда в deque.h
Шаблоны нельзя реализовывать в отдельных cpp-файлах
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 19:39  [ТС] 11
Буду знать, но такая же ошибка, к сожалению
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 19:40 12
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Буду знать, но такая же ошибка, к сожалению
Покажи весь код
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 19:42  [ТС] 13
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
#ifndef  DEQUE_H
#define DEQUE_H
 
#include <iostream>
#include "abiturient.h"
 
using namespace std;
 
template <class T> struct Node
{
    T Data;
    Node<T>* Next;
    Node<T>* Prev;
    Node(const T &data)
    {
        this->Data = data;
        Next = nullptr;
        Prev = nullptr;
    }
};
 
template <class T> 
class Deque
{
    Node<T>* head;
public:
    int size;
    void push_front(const T&);
    T pop_front();
    void push_back(const T&);
    T pop_back();
    const T peek();
    const bool isEmpty();
    Deque<T>& operator= (const Deque&);
    template <class U>
    friend ostream& operator<< (ostream& os, const Abiturient *obj);
    template <class T>
    friend class Iterator;
};
template <class T>
class Iterator
{
    Deque<T>* D;
    Node<T>* current;
public:
    // Конструктор преобразования
    Iterator(Deque<T>& obj)
    {
        D = &obj;
        current = obj.head;
    }
    // Возвращает текущий объект дека без его удаления
    int peek() {
        return current->Data;
    }
    // Переходит к следующему объекту дека
    void next() {
        current = current->Next;
    }
    // Переходит к предыдущему объекту дека
    void prev() {
        current = current->Prev;
    }
    // Переходит в начало дека
    void reset() {
        current = D->head;
    }
    // Проверяет существует ли элемент
    const bool isEmptyElement() {
        if (!current)
            return true;
        else
            return false;
    }
    // Доступ к элементу по адресу
    void set(Node<T>* p = 0) {
        current = p;
    }
};
 
template <class T>
void Deque<T>::push_front(const T& data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* temp = new Node<T>(data);
        temp->Next = head;
        head->Prev = temp;
        head = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в начале дека
template <class T>
T Deque<T>::pop_front()
{
    if (head)
    {
        int temp = head->Data;
        Node<T>* p = head;
        head = p->Next;
        delete[] p;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Вставляет объект как нижний элемент дека
template <class T>
void Deque<T>::push_back(const T& data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        Node<T>* temp = new Node<T>(data);
        tail->Next = temp;
        temp->Prev = tail;
        tail = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в конце дека
template <class T>
T Deque<T>::pop_back()
{
    if (head)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        T temp = tail->Data;
        Node<T>* p = tail;
        tail = p->Prev;
        tail->Next = NULL;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Возвращает объект в верхней части дека без его удаления
template <class T>
const T Deque<T>::peek()
{
    if (head)
        return head->Data;
    else
        return 0;
}
// Проверяет пуст ли дек
template <class T>
const bool Deque<T>::isEmpty() {
    return size == 0;
}
// Перегрузка оператора присваивания
template <class T>
Deque<T>& Deque<T>::operator= (const Deque& obj)
{
    if (this == &obj)
        return *this;
    if (!obj.head)
        return *this;
    head = new Node<T>(obj.head->Data);
    Node<T>* temp = obj.head->Next;
    Node<T>* pnew = 0;
    Node<T>* pold = head;
    while (temp)
    {
        pnew = new Node<T>(temp->Data);
        pnew->Prev = pold;
        pold->Next = pnew;
        pold = pnew;
        temp = temp->Next;
    }
    return *this;
}
// Перегрузка потокового поератора вывода
template <class T>
ostream& operator<<(ostream& os, const Abiturient* obj)
{
    for (Node<T>* i = obj.head; i != NULL; i = i->Next)
        os << i->Data << " ";
    return os;
}
#endif
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
#include "abiturient.h"
 
Abiturient::Abiturient()
{
    this->number = 0;
    this->fio = "";
    this->address = "";
    this->average = 0.0;
    this->markMath = 0;
    this->markRus = 0;
    this->markPhys = 0;
}
 
Abiturient::Abiturient(const Abiturient& cop)
{
    this->number = cop.number;
    this->fio = cop.fio;
    this->address = cop.address;
    this->average = cop.average;
    this->markMath = cop.markMath;
    this->markRus = cop.markRus;
    this->markPhys = cop.markPhys;
}
 
Abiturient::Abiturient(int number, string fio, string adress, float average, int markmath, int markrus, int markphys)
{
    this->number = number;
    this->fio = fio;
    this->address = adress;
    this->average = average;
    this->markMath = markmath;
    this->markRus = markrus;
    this->markPhys = markphys;
}
 
void Abiturient::setNumber(int abiturientNumber)
{
    number = abiturientNumber;
}
 
int Abiturient::getNumber()
{
    return number;
}
 
void Abiturient::setFio(string abiturientName)
{
    fio = abiturientName;
}
 
string Abiturient::getFio()
{
    return fio;
}
 
void Abiturient::setAddress(string abiturientAddress)
{
    address = abiturientAddress;
}
 
string Abiturient::getAddress()
{
    return address;
}
 
void Abiturient::setAverage(float abiturientAverage)
{
    average = abiturientAverage;
}
 
float Abiturient::getAverage()
{
    return average;
}
 
void Abiturient::setMarkMath(int abiturientMarkMath)
{
    markMath = abiturientMarkMath;
}
 
int Abiturient::getMarkMath()
{
    return markMath;
}
void Abiturient::setMarkRus(int abiturientMarkRus)
{
    markRus = abiturientMarkRus;
}
 
int Abiturient::getMarkRus()
{
    return markRus;
}
 
void Abiturient::setMarkPhys(int abiturientMarkPhys)
{
    markPhys = abiturientMarkPhys;
}
 
int Abiturient:: getmarkPhys()
{
    return markPhys;
}
 
ostream& operator<<(ostream& Cout, Abiturient* test)
{
    string temp = "Номер: ";
    temp += to_string(test->getNumber());
    temp += ", ФИО: ";
    temp += test->getFio();
    temp += ", Адрес: ";
    temp += test->getAddress();
    temp += " , Средний балл абитуриента: ";
    temp += to_string(test->getAverage());
    temp += ", Оценка по математике: ";
    temp += to_string(test->getMarkMath());
    temp += ", Оценка по русскому: ";
    temp += to_string(test->getMarkRus());
    temp += ", Оценка по физике: ";
    temp += to_string(test->getmarkPhys());
    Cout << temp;
    return Cout;
}
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
#ifndef ABITURIENT_H
#define ABITURIENT_H
 
#include <iostream>
#include <string>
 
using namespace std;
 
class Abiturient
{
private:
    int number;
    string fio;
    string address;
    float average;
    int markMath;
    int markRus;
    int markPhys;
public:
    Abiturient();
    Abiturient(const Abiturient& cop);
    Abiturient(int number, string fio, string adress, float average, int markmath, int markrus, int markphys);
    void setNumber(int abiturientNumber);
    int getNumber();
    void setFio(string abiturientName);
    string getFio();
    void setAddress(string abiturientAddress);
    string getAddress();
    void setAverage(float abiturientAverage);
    float getAverage();
    void setMarkMath(int abiturientMarkMath);
    int getMarkMath();
    void setMarkRus(int abiturientMarkRus);
    int getMarkRus();
    void setMarkPhys(int abiturientMarkPhys);
    int getmarkPhys();
    friend ostream& operator<<(ostream& Cout, Abiturient* test);
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <Windows.h>
#include "abiturient.h"
#include "deque.h"
 
using namespace std;
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    Deque <Abiturient*> abiturient;
 
    Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
 
    abiturient.push_front(abit);
    cout << abiturient;
    return 0;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 19:45 14
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Deque<T>& operator= (const Deque&);
    template <class U>
    friend ostream& operator<< (ostream& os, const Abiturient *obj);
    template <class T>
    friend class Iterator;
Верни здесь как было
C++
1
2
template <class U>
    friend ostream& operator<< (ostream&os, const Deque<U>& obj)
0
Вездепух
Эксперт CЭксперт С++
11689 / 6368 / 1723
Регистрация: 18.10.2014
Сообщений: 16,051
06.04.2020, 19:46 15
Цитата Сообщение от _Beginner_ Посмотреть сообщение
C++
1
cout << abiturient;
Так а где ваш оператор << для этого? Он у вас был в первой версии кода. Затем вы его зачем-то убрали. Разумеется, теперь ничего не компилируется.
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 19:51  [ТС] 16
Запустилось, но с ошибкой, в отладчике указывает на строку deque.h: head->Prev = temp;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <class T>
void Deque<T>::push_front(const T& data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* temp = new Node<T>(data);
        temp->Next = head;
        head->Prev = temp;
        head = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.04.2020, 19:54 17
Лучший ответ Сообщение было отмечено _Beginner_ как решение

Решение

Цитата Сообщение от _Beginner_ Посмотреть сообщение
Запустилось, но с ошибкой, в отладчике указывает на строку deque.h: head->Prev = temp;
Потому что у тебя head в классе Deque не проинициализирован. Сделай там конструктор по-умолчанию.
1
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
06.04.2020, 20:01  [ТС] 18
Спасибо ещё раз большое, я до этого делал все конструкторы, но думал, что не понадобится, спасибо, что открыли глаза, всё работает
0
06.04.2020, 20:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2020, 20:01
Помогаю со студенческими работами здесь

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt;...

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких...

Реализовать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL
Создать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки...

Реализация структуры "дек"
Реализуйте структуру данных «дек». Напишите программу, моделирующую работу дека, реализовав все...

Реализация класса на базе класса Stack с возможностью !индексирования!
Помогите пожалуйста!!! Нужно реализовать на базе класса stack другой класс с возможностью...

Специализация шаблона класса
Имеется задание: Создать свой шаблонный класс – динамический массив (myvector). Создать методы...


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

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

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