Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056

Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream

12.05.2013, 13:38. Показов 1800. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. В учебнике попалось на первый взгляд простое задание:
C++
1
2
3
4
5
6
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!";
}
нужно модифицировать программу таким образом, чтобы она выводила:
Bash
1
2
3
Initialize
Hello, world!
Clean up
не внося при этом изменений в функцию main().
Сразу возникла идея в следующем коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
std::ostream& operator<<(std::ostream& stream, const char* str)
{
    stream << "Initialize" << std::endl;
    stream << str << std::endl;
    stream << "Clean Up" << std::endl;
    return stream;
}
 
int main()
{
    std::cout << "Hello, world!";
}
при компиляции и запуске - segfault.
Пробую прогнать в отладчике и вижу что зацикливается в строке stream << "Initialize" << std::endl;
Не пойму в чём дело.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2013, 13:38
Ответы с готовыми решениями:

Как для класса написать перегруженный оператор new?
пробую таким способом, но ошибка class X { public: X(int x) :mX(x) { } void SetX(int x) { mX=x; } int GetX() const ...

Не работает перегруженный оператор + для класса динамической матрицы
Подскажите, почему не работает перегруженный + для складывания двух матриц одного размера. #include &lt;iostream&gt; #include...

Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка. Всем огромное спасибо за помощь! |

9
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.05.2013, 13:46
Цитата Сообщение от xtorne21st Посмотреть сообщение
Пробую прогнать в отладчике и вижу что зацикливается в строке stream << "Initialize"
рекурсия однако
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
12.05.2013, 13:49  [ТС]
Jupiter, что-то не пойму как в таком случаи будет правильный вариант решения.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.05.2013, 13:50
Конструктор и деструктор для cout
1
 Аватар для GetVariable
164 / 120 / 46
Регистрация: 17.03.2013
Сообщений: 284
12.05.2013, 14:33
C++
1
2
3
4
5
6
7
8
9
ostream& operator << (ostream& os,  Date& date)
{
    os << setfill('0');
    os << setw(2) << date.getDay() << '.'
       << setw(2) << date.getMonth() << '.'
       << setw(4) << date.getYear();
    os << setfill(' ');
    return os;
}
0
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
12.05.2013, 14:40
Цитата Сообщение от xtorne21st Посмотреть сообщение
const char* str
разве можно перегружать для стандартных типов?
0
28 / 28 / 8
Регистрация: 20.05.2012
Сообщений: 43
12.05.2013, 16:11
Можно сделать такую реализацию!
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>
using namespace std;
 
struct Begin
{  
    ostream &operator <<(string str) 
    { 
        cout<<"Begin"<<endl;
        cout<<str<<endl;
        cout<<"End"<<endl;
        return (cout); 
    }
}beg;
 
 
 
int main()
{
    beg << "Hello, World!" <<endl;
    cin.get();
}
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
12.05.2013, 16:24  [ТС]
Precise, подправил под задание:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class Foo
{
    public:
        std::ostream& operator<<(const char* s)
        {
            std::cout << "Initialize" << std::endl;
            std::cout << s << std::endl;
            std::cout << "Clean up";
            return (std::cout);
        }
} cout;
 
int main()
{
    cout << "Hello, world!" << std::endl;
}
Добавлено через 1 минуту
Либо, как уже было отмечено выше, можно использовать констуктор/деструктор глобального объекта.

Добавлено через 1 минуту
SeregaC++, ну вроде бы пробовал перегружать для объекта класса ostream...
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
12.05.2013, 16:30
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
std::ostream& operator<<(std::ostream& stream, const char* str)
{
    if (strcmp(str, "Hello world") != 0)
        return;
 
    stream << "Initialize" << std::endl;
    stream << str << std::endl;
    stream << "Clean Up" << std::endl;
    return stream;
}
 
int main()
{
    std::cout << "Hello, world!";
}
0
 Аватар для System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
26.05.2015, 14:43
Подскажите пожалуйста. Как перегрузить оператор cout,не определяя ее дружественной функцией,а внутри класса?Надо сделать по заданию,но не пойму как,вылетают ошибки [C++ Error] Unit1.cpp(21): E2094 'operator<<' not implemented in type 'PhoneNumber' for arguments of type 'ostream' , чтоб можно было cout наоборот использовать,вот так - "Объект класса" << 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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include "Unit2.h"
 
using namespace std;
 
int main()
{
 PhoneNumber phone;
 cout << "Enter phone number in the from (123) 456-7890:" << endl;
 // cin >> phone вызывает operator>>, неявно генерируя
 // вызов глобальной функции operator>>(cin,phone)
 cin >> phone;
 cout << "The phone number entered was: ";
 
 // cout << phone вызывает operator<<, неявно генерируя
 // вызов глобальной функции operator<<(cout,phone)
 phone << cout;
// cout << phone;
 system("pause");
 return 0;
}
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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include "Unit2.h"
 
using namespace std;
 
// перегруженная операция передачи в поток; не может быть элементом класса,
// если мы хотим применять ее в форме cout << somePhoneNumber;
PhoneNumber PhoneNumber::operator<<(const PhoneNumber &number)
{
  cout << "(" << number.areaCode << ") " << number.exchange << "-"
         << number.line;
  return cout; // допускает форму cout << a << b << c;
}
 
// перегруженная операция извлечения из потока; не может быть элементом класса,
// если мы хотим применять ее в форме cin >> somePhoneNumber;
istream &operator>>(istream &input, PhoneNumber &number)
{
  input.ignore(); // пропустить (
  input >> setw(3) >> number.areaCode; // ввести код региона
  input.ignore(2); // пропустить ( и пробел
  input >> setw(3) >> number.exchange; // ввести код АТС
  input.ignore(); // пропустить дефис (-)
  input >> setw(4) >> number.line; // ввести номер линии
  return input; // допускает форму cin >> a >> b >> c;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
#ifndef Unit2H
#define Unit2H
class PhoneNumber
{
 
    friend istream &operator>>(istream &, PhoneNumber &);
  public:
    PhoneNumber operator<<(const PhoneNumber &);
  private:
    string areaCode; // 3 цифры регионального кода
    string exchange; // 3 цифры кода АТС
    string line; // 4 цифры номера линии
};
//---------------------------------------------------------------------------
#endif
Добавлено через 1 час 21 минуту
Никто не знает чтоль как оператор << перегрузить обычной функцией в классе? Я не могу сообразить,что должна возвращать функция? На "cout" ругается, пишет ошибку - [C++ Error] Unit2.cpp(15): E2034 Cannot convert 'ostream' to 'PhoneNumber' . Ну подскажите плз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2015, 14:43
Помогаю со студенческими работами здесь

Объявление класса, создание объекта и вызов функции-члена
Всем добрый день! Вот так я объявляю класс. typedef map&lt;string, double&gt; datablock; typedef map&lt;string, string&gt; groupvars;...

Определить перегруженный бинарный и унарный оператор* для класса "Комплексное число"
Как можно реализовать перегруженный бинарный и унарный оператор* для класса &quot;Комплексное число&quot;?

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

Функции и перегруженный оператор
Помогите реализовать на С++: 1.Определить пользовательский тип данных fraction (дробь), представляющий собой структуру из 2х полей:...

Перегруженный оператор () для std::set
Зачем в СТЛ в контейренах типу SET и других перегружать оператор () вот код struct WordEntryLessById { bool operator ()...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru