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

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

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.05.2013, 13:38     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #1
Добрый день. В учебнике попалось на первый взгляд простое задание:
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
Посмотрите здесь:

C++ Функции и перегруженный оператор
C++ Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса?
C++ Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
Перегруженный оператор () для std::set C++
C++ Инициализация константного статического объекта - члена класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.05.2013, 13:46     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #2
Цитата Сообщение от xtorne21st Посмотреть сообщение
Пробую прогнать в отладчике и вижу что зацикливается в строке stream << "Initialize"
рекурсия однако
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.05.2013, 13:49  [ТС]     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #3
Jupiter, что-то не пойму как в таком случаи будет правильный вариант решения.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.05.2013, 13:50     Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream #4
конструктор и деструктор для cout
GetVariable
 Аватар для 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
429 / 364 / 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
интересующийся
300 / 271 / 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
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
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
Еще ссылки по теме:

Как для класса написать перегруженный оператор new? C++
глюк при написании перегруженного ostream для класса C++
C++ Объявление класса, создание объекта и вызов функции-члена

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

Или воспользуйтесь поиском по форуму:
System16v
 Аватар для 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
Ответ Создать тему
Опции темы

Текущее время: 16:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru