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

Вывести стек из экземпляров класса

02.05.2019, 17:14. Показов 1469. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, не выводит стек. Стек типа Person. В задании нужно именно создать новый, не используя STL.
Ошибка C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "T" (или приемлемое преобразование отсутствует) . Жалуется на данную строку
Кликните здесь для просмотра всего текста
cout << "|" << setw(4) << stackPtr[ix] << endl;
, не понимаю, что здесь не так. Если вносить в стек простые числа, все работает без ошибок.

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
#include "pch.h"
#ifndef STACK_H
#define STACK_H
#include <cassert> 
#include <iostream>
#include <iomanip> 
#include <windows.h>
using namespace std;
template <typename T>
class Stack
{
private:
    T *stackPtr;                      // указатель на стек
    const int size;                   // максимальное количество элементов в стеке
    int top;                          // номер текущего элемента стека
public:
    Stack(int = 10);                  // по умолчанию размер стека равен 10 элементам
    Stack(const Stack<T> &);          // конструктор копирования
    inline void push(const T &);     // поместить элемент в вершину стека
    inline T pop();                   // удалить элемент из вершины стека и вернуть его
    inline void printStack();         // вывод стека на экран
    inline const T &Peek(int) const; // n-й элемент от вершины стека
    inline int getStackSize() const;  // получить размер стека
    inline T *getPtr() const;         // получить указатель на стек
    inline int getTop() const;        // получить номер текущего элемента в стеке
};
// реализация методов шаблона класса STack
// конструктор Стека
template <typename T>
Stack<T>::Stack(int maxSize) :
    size(maxSize) // инициализация константы
{
    stackPtr = new T[size]; // выделить память под стек
    top = 0; // инициализируем текущий элемент нулем;
}
// конструктор копирования
template <typename T>
Stack<T>::Stack(const Stack<T> & otherStack) :
    size(otherStack.getStackSize()) // инициализация константы
{
    stackPtr = new T[size]; // выделить память под новый стек
    top = otherStack.getTop();
    for (int ix = 0; ix < top; ix++)
        stackPtr[ix] = otherStack.getPtr()[ix];}
// функция добавления элемента в стек
template <typename T>
inline void Stack<T>::push(const T &value)
{
    // проверяем размер стека
    assert(top < size); // номер текущего элемента должен быть меньше размера стека
 
    stackPtr[top++] = value; // помещаем элемент в стек
}
 
// функция удаления элемента из стека
template <typename T>
inline T Stack<T>::pop()
{
    // проверяем размер стека
    assert(top > 0); // номер текущего элемента должен быть больше 0
 
    stackPtr[--top]; // удаляем элемент из стека
}
 
// функция возвращает n-й элемент от вершины стека
template <class T>
inline const T &Stack<T>::Peek(int nom) const
{
    //
    assert(nom <= top);
 
    return stackPtr[top - nom]; // вернуть n-й элемент стека
}
 
// вывод стека на экран
template <typename T>
inline void Stack<T>::printStack()
{
    for (int ix = top - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
 
// вернуть размер стека
template <typename T>
inline int Stack<T>::getStackSize() const
{
    return size;
}
 
// вернуть указатель на стек (для конструктора копирования)
template <typename T>
inline T *Stack<T>::getPtr() const
{
    return stackPtr;
}
 
// вернуть размер стека
template <typename T>
inline int Stack<T>::getTop() const
{
    return top;
}
#endif // STACK_H
class Person
{
    char pol[32];
    char name[32];
    char surname[32];
    int age;
public:
    void fillData();
    void showData();
};
int main(int argc, char** argv)
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    
    Stack <Person> stack;
    Person FirstChild;
    Person SecondChild;
    cout << "Внесите данные!\n";
    FirstChild.fillData();
    SecondChild.fillData();
    stack.push(FirstChild);
    stack.push(SecondChild);
    stack.printStack();
    return 0;
}
void Person::fillData()
{
    cout << "Пол: ";
    cin.getline(pol, 32);
    cout << "Имя: ";
    cin.getline(name, 32);
    cout << "Фамилия: ";
    cin.getline(surname, 32);
    cout << "Возраст: ";
    cin >> age;
    cin.get();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2019, 17:14
Ответы с готовыми решениями:

Массив экземпляров класса
Доброго времени суток уважаемые форумчане. Возник вопрос: как заполнять массив экземплярами класса...

Инициализация экземпляров класса из файла
Люди добрые, подскажите как написать метод класса для инициализации объектов из файла: Apt.h ...

Указатель на массив экземпляров класса
Пытаюсь разобраться с указателями, но видимо что-то совсем плохо понимаю: class bull {int x;};...

ошибка при выводе экземпляров класса
написал класс, но при работе функции принт оно выдает что не может считать память, хотя явных...

15
6103 / 3459 / 1404
Регистрация: 07.02.2019
Сообщений: 8,780
02.05.2019, 19:01 2
Цитата Сообщение от Johannex Посмотреть сообщение
Жалуется на данную строку
Ну так определите оператор вывода в поток для вашего Person
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 25
02.05.2019, 19:18  [ТС] 3
Не совсем понимаю, что нужно определить. С++ изучаю недавно и тут сразу такое задание дали.
0
5 / 3 / 2
Регистрация: 28.02.2019
Сообщений: 29
02.05.2019, 19:42 4
Цитата Сообщение от Johannex Посмотреть сообщение
изучаю недавно
Учитывая что вы взялись писать реализацию стека, да еще и вникая в метапрограммирование, наверное следовало изучить перегрузку операторов.
А вообще если вы обращали внимание на std::cout то при наведении курсором на символы << можно увидеть что-такое
C++
1
std::ostream& operator<<(ostream&.....)
,как-то так вроде.
Так вот чтобы программа смогла работать с вашим классом и выводить то, что вы хотите в поток, следует определить и реализовать перегрузку этого самого оператора << . Тогда будет вам счастье и сдача задания.
P.S Не особо придираюсь, но с какой целью вы объявляете почти каждый метод встроенным?
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 25
02.05.2019, 19:51  [ТС] 5
Если хорошо понял, нужно:
C++
1
2
3
4
friend std::ostream& operator <<(std::ostream &os, const Person &c){
        os << "(" << c.name << ", " << c.surname <<..........<< ")";
        return os;
    }
Правильно ли понял ?
А еще создать конструктор по умолчанию в классе Person ?
Стек был написан не мной, насчет встроенных методов тоже не определился еще.
0
5 / 3 / 2
Регистрация: 28.02.2019
Сообщений: 29
02.05.2019, 19:58 6
Цитата Сообщение от Johannex Посмотреть сообщение
Правильно ли понял ?
Да вы правильно поняли.
Цитата Сообщение от Johannex Посмотреть сообщение
А еще создать конструктор по умолчанию в классе Person ?
Все зависит от ваших предпочтений, у вас есть метод
Код
fillData()
там у вас идет заполнение, а конструктора у вас все есть, но они так сказать пустые, то есть ничего не делают, если делать со стороны эстетики кода и философии то следует определить конструктора(есть таки правила конструирования классов для работы, как правило пяти и правило трех, вроде так называются), опять же если лень то можете не определять, а если как правильно будет то да можете)

Добавлено через 2 минуты
Цитата Сообщение от Johannex Посмотреть сообщение
Стек был написан не мной
Тогда прошу прощения за свои "замечания"))
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 25
02.05.2019, 20:12  [ТС] 7
Получилось так, но опять вылезла ошибка из шапки темы. Хотя сделал все по примеру..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person
{
    char pol[32];
    char name[32];
    char surname[32];
    int age;
public:
    void fillData();
    void showData();
    friend ostream& operator <<(ostream &out, const  Person &person);
};
ostream& operator<< (ostream &out, const Person &person)
{
    out << "Итог:"<< person.pol << person.name << person.surname << person.age << "|";
        return out;
}
0
5 / 3 / 2
Регистрация: 28.02.2019
Сообщений: 29
02.05.2019, 20:17 8
Цитата Сообщение от Johannex Посмотреть сообщение
вылезла ошибка из шапки темы
У меня все четко работает, только разделители бы не помешали бы в перегрузке.
Уверены в ошибке?
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 25
02.05.2019, 20:27  [ТС] 9
Да, ошибок нет. Забыл закомментить эту проблемную строку.
C++
1
2
3
4
5
6
template <typename T>
inline void Stack<T>::printStack()
{
    for (int ix = top - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
Код скомпилировался, но не выводит стек. Что-то нужно в main дописать или не в правильном порядке располжил методы и классы?
0
5 / 3 / 2
Регистрация: 28.02.2019
Сообщений: 29
02.05.2019, 20:32 10
Какую строку вы закомментили?
Лично я просто скопировал стек и ваш класс и дружественную функцию и сам main() собственно и у меня все работает.
Желательно кидать что выводит и мб вывод компилятора какой-то, в зависимости что у вас есть.
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 25
02.05.2019, 20:54  [ТС] 11
template <typename T>
inline void Stack<T>:rintStack()
{
for (int ix = top - 1; ix >= 0; ix--)
cout << "|" << setw(4) << stackPtr[ix] << endl;
}
Вот это и закомментил. И в main убрал stack.printStack(); . Из-за этого ошибки выводило. Стек не выводит...Только то, что пишу..
Миниатюры
Вывести стек из экземпляров класса  
0
5 / 3 / 2
Регистрация: 28.02.2019
Сообщений: 29
02.05.2019, 20:57 12
Ну как вы хотите чтобы оно выводило если вы закомментили собственно шаблон функции вывода стека?
Можно подробнее об ошибках конкретно этого шаблона функции, просто у меня нет никаких ошибок(P.S VS 2019)
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 25
02.05.2019, 21:08  [ТС] 13
Если не комментить, вывод опять ту же самую ошибку, из шапки. VS 2017
0
5 / 3 / 2
Регистрация: 28.02.2019
Сообщений: 29
02.05.2019, 21:11 14
Лучший ответ Сообщение было отмечено Johannex как решение

Решение

Я не знаю что у вас там в коде, но я вот как сделал
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
#include "pch.h"
#ifndef STACK_H
#define STACK_H
#include <cassert> 
#include <iostream>
#include <iomanip> 
#include <windows.h>
using namespace std;
template <typename T>
class Stack
{
private:
    T* stackPtr;                      // указатель на стек
    const int size;                   // максимальное количество элементов в стеке
    int top;                          // номер текущего элемента стека
public:
    Stack(int = 10);                  // по умолчанию размер стека равен 10 элементам
    Stack(const Stack<T>&);          // конструктор копирования
    inline void push(const T&);     // поместить элемент в вершину стека
    inline T pop();                   // удалить элемент из вершины стека и вернуть его
    inline void printStack();         // вывод стека на экран
    inline const T& Peek(int) const; // n-й элемент от вершины стека
    inline int getStackSize() const;  // получить размер стека
    inline T* getPtr() const;         // получить указатель на стек
    inline int getTop() const;        // получить номер текущего элемента в стеке
};
// реализация методов шаблона класса STack
// конструктор Стека
template <typename T>
Stack<T>::Stack(int maxSize) :
    size(maxSize) // инициализация константы
{
    stackPtr = new T[size]; // выделить память под стек
    top = 0; // инициализируем текущий элемент нулем;
}
// конструктор копирования
template <typename T>
Stack<T>::Stack(const Stack<T>& otherStack) :
    size(otherStack.getStackSize()) // инициализация константы
{
    stackPtr = new T[size]; // выделить память под новый стек
    top = otherStack.getTop();
    for (int ix = 0; ix < top; ix++)
        stackPtr[ix] = otherStack.getPtr()[ix];
}
// функция добавления элемента в стек
template <typename T>
inline void Stack<T>::push(const T & value)
{
    // проверяем размер стека
    assert(top < size); // номер текущего элемента должен быть меньше размера стека
 
    stackPtr[top++] = value; // помещаем элемент в стек
}
 
// функция удаления элемента из стека
template <typename T>
inline T Stack<T>::pop()
{
    // проверяем размер стека
    assert(top > 0); // номер текущего элемента должен быть больше 0
 
    stackPtr[--top]; // удаляем элемент из стека
}
 
// функция возвращает n-й элемент от вершины стека
template <class T>
inline const T& Stack<T>::Peek(int nom) const
{
    //
    assert(nom <= top);
 
    return stackPtr[top - nom]; // вернуть n-й элемент стека
}
 
// вывод стека на экран
template <typename T>
inline void Stack<T>::printStack()
{
    for (int ix = top - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
 
// вернуть размер стека
template <typename T>
inline int Stack<T>::getStackSize() const
{
    return size;
}
 
// вернуть указатель на стек (для конструктора копирования)
template <typename T>
inline T* Stack<T>::getPtr() const
{
    return stackPtr;
}
 
// вернуть размер стека
template <typename T>
inline int Stack<T>::getTop() const
{
    return top;
}
#endif // STACK_H
class Person
{
    char pol[32];
    char name[32];
    char surname[32];
    int age;
public:
    void fillData();
    //void showData();
    friend ostream& operator <<(ostream& out, const  Person& person);
};
ostream& operator<< (ostream& out, const Person& person)
{
    out << "Итог:" << person.pol << person.name << person.surname << person.age << "|";
    return out;
}
int main(int argc, char** argv)
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
 
    Stack <Person> stack;
    Person FirstChild;
    Person SecondChild;
    cout << "Внесите данные!\n";
    FirstChild.fillData();
    SecondChild.fillData();
    stack.push(FirstChild);
    stack.push(SecondChild);
    stack.printStack();
    return 0;
}
void Person::fillData()
{
    cout << "Пол: ";
    cin.getline(pol, 32);
    cout << "Имя: ";
    cin.getline(name, 32);
    cout << "Фамилия: ";
    cin.getline(surname, 32);
    cout << "Возраст: ";
    cin >> age;
    cin.get();
}
Добавлено через 43 секунды
Это конечно смешно, но попробуйте просто скопировать и проверить)))
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 25
02.05.2019, 21:14  [ТС] 15
Наверно буфер программы забился, создал заново и вставил, заработало. Большое спасибо Вам за помощь)
0
5 / 3 / 2
Регистрация: 28.02.2019
Сообщений: 29
02.05.2019, 21:16 16
Пожалуйста))
0
02.05.2019, 21:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2019, 21:16
Помогаю со студенческими работами здесь

Статическое поле,количество экземпляров класса
Помогите понять,статическое поле stcount считает количество созданных экземпляров класса...

Реализация динамического создания экземпляров класса.
Добрый вечер. Есть программа: //HEADER.h #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Реализовать операторы сравнения двух экземпляров класса (==, !==)
Приведите пример такой перегрузки, пожалуйста

Написать метод, инициализирующий массив экземпляров класса
метод инициализирует массив экземпляров класса , #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...


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

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

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