Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

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

12.05.2013, 13:38. Просмотров 699. Ответов 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;
Не пойму в чём дело.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2013, 13:38     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream
Посмотрите здесь:

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

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

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

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

Инициализация константного статического объекта - члена класса - C++
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является членом класса. Этот объект должен быть...

Класс для работы с матрицами - Что дает перегруженный оператор индексирования? - C++
Есть работающая программа, которая имеет: конструктор с параметрами, который заполняет матрицу псевдослучайными числами конструктор...

глюк при написании перегруженного ostream для класса - C++
Доброе время суток всем! Возникла проблема есть некий класс client смотреть ниже класс авто и класс персона Все отлично работало до того...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.05.2013, 13:46     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #2
Цитата Сообщение от xtorne21st Посмотреть сообщение
Пробую прогнать в отладчике и вижу что зацикливается в строке stream << "Initialize"
рекурсия однако
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.05.2013, 13:49  [ТС]     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #3
Jupiter, что-то не пойму как в таком случаи будет правильный вариант решения.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.05.2013, 13:50     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #4
конструктор и деструктор для cout
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
12.05.2013, 14:33     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #5
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;
}
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
12.05.2013, 14:40     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #6
Цитата Сообщение от xtorne21st Посмотреть сообщение
const char* str
разве можно перегружать для стандартных типов?
Precise
26 / 26 / 1
Регистрация: 20.05.2012
Сообщений: 43
12.05.2013, 16:11     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #7
Можно сделать такую реализацию!
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();
}
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.05.2013, 16:24  [ТС]     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #8
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...
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
12.05.2013, 16:30     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #9
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!";
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2015, 14:43     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream
Еще ссылки по теме:

Функция вне класса для передачи функции объекта - C++
Добрый вечер, уважаемые форумчане. Столкнулся с таким пунктом в условии задания: Создать функцию вне класса для передачи функции...

Функции в качестве члена класса - C++
Вот изучаю классы, и я так понял,можно описывать функции вне класса, достаточно знака &quot;: :&quot;. Вот решил написать, поэкспериментировать....

Как такое может быть? (вызов функции-члена без объекта) - C++
собственно вопрос озвучен. #include &lt;iostream&gt; using namespace std; class Test { public: void print() {

Вызов функции-члена класса по адресу в памяти - C++
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...

Определить операторы как функции члена класса - C++
Добрый вечер! Ребята, помогите решить вот такую задачку: Необходимо определить операторы +, =, +=, -=, *=, , как функции члена...


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

Или воспользуйтесь поиском по форуму:
System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
26.05.2015, 14:43     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #10
Подскажите пожалуйста. Как перегрузить оператор 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' . Ну подскажите плз.
Yandex
Объявления
26.05.2015, 14:43     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream
Ответ Создать тему
Опции темы

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