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

Классы. Перегруженные операторы ввода-вывода

10.10.2015, 22:56. Показов 947. Ответов 7
Метки нет (Все метки)

Есть класс book, который описывает 3 типа данных, то есть автор - char, название книги - char, год - int.
Нужно использовать перегруженный оператор ввода-вывода и вывести на экран инфу о 5 книгах в таком виде (Толстой: Война и Мир, 2015). Пытался сначала понять как сделать это без перегружённого оператора, но даже так не вышло, как только ввожу инфу 1 книги то мне сразу выводит какую-ту хрень мусорную сразу о 5 книгах, при том что ввёл я только имя автора 1 книги, то есть, кратко говоря, непонятные символы и мусор, а ошибка в компиляторе такая - Stack around the variable 't' was corrupted. Подскажите где и как исправить, и как с этого сотворить перегружённый оператор ввода-вывода.

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
#include <iostream>
#include <string.h>
#include <conio.h>
 
class book
{
private:
 char author[20];
 char title[20];
 int year;
 public:
void input(char* n, char* t, int s)
{
 strcpy(author, n);
 strcpy(title, t);
 year = s;
}
void output()
{
    cout << author << ": " << title << ", " << year;
}
};
int main ()
{
 system("cls");
 char name;
 char abook;
 int year = 0;
 
 book t[5];
 for(int i(0);i<5;i++)
 {
     cout << i+1 << " book:" << endl;
     cout << "Author - ";
     cin >> name;
     cout << "\nBook - ";
     cin >> abook;
     cout << "\nYear - ";
     cin >> year;
     t[i].input(&name,&abook,year);
 }
 system("cls");
 for(int i(0);i<5;i++)
 {
     t[i].output();
     cout << endl;
 }
 getch();
 return 0;
 }
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2015, 22:56
Ответы с готовыми решениями:

Наследование, перегруженные операторы ввода-вывода, динамический массив
Суть задания - создать базовый класс - worker, в котором будут поля - имя, фамилия, отчество. В нём...

Почему перегруженные операторы ввода/вывода нельзя сделать членами класса?
Добрый вечер, Решаю домашнее задание, и вот вопрос возник. Создал класс и перегрузил...

Операторы присваивания, ввода- вывода. Операторы ветвления, выбора
Даны два ненулевых числа. Найти их сумму, разность, произведение, частное, остаток и целую часть от...

Написать шаблонные, перегруженные функции для ввода и вывода на экран массивов и матриц
Добрый вечер всем! Помогите написать написать шаблонные, перегруженные функции input и output для...

7
Модератор
Эксперт С++
10733 / 8888 / 5369
Регистрация: 18.12.2011
Сообщений: 23,779
10.10.2015, 23:04 2
Лучший ответ Сообщение было отмечено L1oN как решение

Решение

Цитата Сообщение от L1oN Посмотреть сообщение
char name;
char abook;
C++
1
2
char name[20]; 
char abook[20];
https://www.cyberforum.ru/cpp-... 62479.html
0
Эксперт С++
8327 / 4013 / 880
Регистрация: 15.11.2014
Сообщений: 9,033
10.10.2015, 23:21 3
Лучший ответ Сообщение было отмечено L1oN как решение

Решение

как то так:

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
#include <iostream>
#include <string>
 
#ifndef OUT_STREAM
    #define OUT_STREAM(type_)     \
        template<class T>friend   \
        ::std::basic_ostream<T>&  \
        operator<<(::std::basic_ostream<T>& os, const type_& obj )
#endif
 
#ifndef IN_STREAM
    #define IN_STREAM(type_)      \
        template<class T>friend   \
        ::std::basic_istream<T>&  \
        operator>>(::std::basic_istream<T>& is, type_& obj )
#endif
 
 
class book
{
    OUT_STREAM(book)
        { return os << "(" << obj.author << ", " << obj.title << ", " << obj.year << ")"; }
    
    IN_STREAM(book)
    {
        std::cout<< "enter author: "; is >> obj.author; std::cout<<'\n';
        std::cout<< "enter title: ";  is >> obj.title;  std::cout<<'\n';
        std::cout<< "enter year: ";   is >> obj.year;   std::cout<<'\n';
        return is;
    }
 
    std::string author;
    std::string title;
    size_t      year;
};
 
int main ()
{
    book books[3] = {};
    
    for(auto& book: books)
        std::cin >> book;
    
    for(const auto& book: books)
        std::cout << book << std::endl;
 }
1
3 / 3 / 1
Регистрация: 25.03.2015
Сообщений: 63
10.10.2015, 23:53  [ТС] 4
Можете прокомментировать код? А то некоторые вещи впервые вижу.
0
Эксперт С++
8327 / 4013 / 880
Регистрация: 15.11.2014
Сообщений: 9,033
11.10.2015, 00:30 5
Лучший ответ Сообщение было отмечено L1oN как решение

Решение

Цитата Сообщение от L1oN Посмотреть сообщение
Можете прокомментировать код?
запросто:

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
//#include <iostream>
//#include <string>
 
#if 0 
#ifndef OUT_STREAM
    #define OUT_STREAM(type_)     \
        template<class T>friend   \
        ::std::basic_ostream<T>&  \
        operator<<(::std::basic_ostream<T>& os, const type_& obj )
#endif
 
#ifndef IN_STREAM
    #define IN_STREAM(type_)      \
        template<class T>friend   \
        ::std::basic_istream<T>&  \
        operator>>(::std::basic_istream<T>& is, type_& obj )
#endif
#endif 
 
//class book
//{
//    OUT_STREAM(book)
//        { return os << "(" << obj.author << ", " << obj.title << ", " << obj.year << ")"; }
//    
//    IN_STREAM(book)
//    {
//        std::cout<< "enter author: "; is >> obj.author; std::cout<<'\n';
//        std::cout<< "enter title: ";  is >> obj.title;  std::cout<<'\n';
//        std::cout<< "enter year: ";   is >> obj.year;   std::cout<<'\n';
//        return is;
//    }
// 
//    std::string author;
//    std::string title;
//    size_t      year;
//};
// 
//int main ()
//{
//    book books[3] = {};
//    
//    for(auto& book: books)
//        std::cin >> book;
//    
//    for(const auto& book: books)
//        std::cout << book << std::endl;
// }
Цитата Сообщение от L1oN Посмотреть сообщение
некоторые вещи впервые вижу.
что именно не понятно?
0
3 / 3 / 1
Регистрация: 25.03.2015
Сообщений: 63
11.10.2015, 00:40  [ТС] 6
Ну для начала, я думаю, мне стоит прочитать об этих перегружённых операторах, а то этот код до 17 строчки мне вообще непонятен, в потоке/вне потока, шаблонные классы, дружественные классы.
И параметры цикла for, словно auto само определяет сколько раз надо выполнить итерацию.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#if 0 
#ifndef OUT_STREAM
    #define OUT_STREAM(type_)     \
        template<class T>friend   \
        ::std::basic_ostream<T>&  \
        operator<<(::std::basic_ostream<T>& os, const type_& obj )
#endif
 
#ifndef IN_STREAM
    #define IN_STREAM(type_)      \
        template<class T>friend   \
        ::std::basic_istream<T>&  \
        operator>>(::std::basic_istream<T>& is, type_& obj )
#endif
#endif 
 
for(auto& book: books)
for(const auto& book: books)
0
Эксперт С++
8327 / 4013 / 880
Регистрация: 15.11.2014
Сообщений: 9,033
11.10.2015, 01:03 7
Лучший ответ Сообщение было отмечено L1oN как решение

Решение

Цитата Сообщение от L1oN Посмотреть сообщение
код до 17 строчки мне вообще непонятен
это - макросы препроцессора.

вместо OUT_STREAM
тупо подставляется текст

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

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
#include <iostream>
#include <string>
 
class book
{
    template<class T>friend   
    ::std::basic_ostream<T>&  
    operator<<(::std::basic_ostream<T>& os, const book& obj )
        { return os << "(" << obj.author << ", " << obj.title << ", " << obj.year << ")"; }
    
    template<class T>friend   
    ::std::basic_istream<T>&  
    operator>>(::std::basic_istream<T>& is, book& obj )
    {
        std::cout<< "enter author: "; is >> obj.author; std::cout<<'\n';
        std::cout<< "enter title: ";  is >> obj.title;  std::cout<<'\n';
        std::cout<< "enter year: ";   is >> obj.year;   std::cout<<'\n';
        return is;
    }
 
    std::string author;
    std::string title;
    size_t      year;
};
 
int main ()
{
    book books[3] = {};
    
    for(auto& book: books)
        std::cin >> book;
    
    for(const auto& book: books)
        std::cout << book << std::endl;
 }
Цитата Сообщение от L1oN Посмотреть сообщение
И параметры цикла for, словно auto само определяет сколько раз надо выполнить итерацию.
цикл вида:
C++
1
for(auto&& i : container) { ... }
равносилен обычному циклу прохода по всем элементам коллекции с шагом 1.

где container - любой stl-compatible контейнер, или массив.
а i - очередной элемент коллекции,
над которым можно выполнять действия в текущей итерации цикла.
0
3 / 3 / 1
Регистрация: 25.03.2015
Сообщений: 63
11.10.2015, 01:30  [ТС] 8
Спасибо за ответ и разъяснение!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2015, 01:30

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Операторы ввода вывода
Сама задача. Реализовать класс «бинарное дерево» рекурсивно реализовав в нем метод добавления...

Операторы ввода вывода в С++
ребят дайте пожалуйста понятную ссылку что бы можно было почитать и выучить операторы ввода вывода...

Операторы ввода/вывода
Всем привет! Было задание: сделать сложение двух окружностей, н.р. int main() { Circle...

Операторы ввода и вывода
Допустим есть класс class Checked { public: private: double id; int *beg;...

Не читаются операторы ввода вывода
#include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;iostream&gt; using namespace std; void main() {...

Перегрузите операторы ввода и вывода
Описание класса-шаблона должно включать операторы &lt;&lt;, &gt;&gt;, конструктор копирования, а также другие...


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

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

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