Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с переопределением операций << и >> 
V
    Опции темы
yngwie19
Дата 3.10.2008, 15:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Доброго времени суток. Начал разбираться с темой перегрузка операторов и сразу встал. В книге вводная часть немного пропущена, (так сказать перешли сразу к делу). Мне бы хотелось подробнее разобраться в том, что Я конкретно делаю, когда описываю функцию оператор.
Например в книге дан пример:

Код

struct clock {          // Простая структура данных
              int hr, min, sec;
              clock(int h, int m, int s) { hr = h; min = m; sec = s; }
            };



Для переопределения << для вывода объектов типа clock требуется следующее определение: 

Код

ostream& operator<<(ostream& strm, clock& c)
            {
              strm << c.hr << ":" << c.min << ":" << c.sec;



Теперь можно организовать вывод для объектов типа clock следующим образом: 

Код

clock c(12,31,55);
            cout << c;



Мне бы хотелось, чтобы Вы мне объяснили функцию ostream& operator<<(ostream& strm, clock& c), что она делает, и как это работает.
P.S: Кстати пример из книги у меня не компилится ))
PM MAIL   Вверх
mrbrooks
Дата 3.10.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Код

ostream& operator<<(ostream& strm, clock& c)
            {
              strm << c.hr << ":" << c.min << ":" << c.sec;
              return strm;
            }


Добавлено @ 15:49
и как сейчас помню функция должна быть дружественной к классу (структуре)

Добавлено @ 15:50
Код

struct clock {          // Простая структура данных
              int hr, min, sec;
              clock(int h, int m, int s) { hr = h; min = m; sec = s; }
              friend ostream& operator<<(ostream& strm, clock& c); 
            };


Это сообщение отредактировал(а) mrbrooks - 3.10.2008, 15:51
PM MAIL   Вверх
yngwie19
Дата 3.10.2008, 16:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



не компилится  smile 
 smile 
PM MAIL   Вверх
IKM2007
Дата 3.10.2008, 16:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



yngwie19, Возможно ошибка в твоем коде. Вот простой пример использования перегруженных операции ввода и вывода.
Код

#include <iostream>
using std::ostream;
using std::istream;
using std::cout;
using std::cin;
class T
{
friend istream & operator >> (istream &,T &);
friend ostream & operator << (ostream &,T &);
public:
    T(int=1,int=1);
private:
    int x;
    int y;
};
T::T(int a,int b):x(a),y(b)
{}
istream & operator >> (istream & in,T &r)
    {
    cout<<"Enter x & y:\nx=";
    in>>r.x;
    cout<<"y=";
    in>>r.y;
    return in;
    }
ostream& operator << (ostream& out,T &r)
    {
       return  out <<"\nx="<< r.x <<"\ny="<<r.y<<"\n";
    }
void main()
{
T a;
cin>>a;
cout<<a;
}

Если есть вопросы, задавай. smile 


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
J0ker
Дата 3.10.2008, 21:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(mrbrooks @  3.10.2008,  15:48 Найти цитируемый пост)
и как сейчас помню функция должна быть дружественной к классу (структуре)

только если она осуществляет доступ к приватным/защещенным мемберам

Цитата(yngwie19 @  3.10.2008,  15:21 Найти цитируемый пост)
Код
ostream& operator<<(ostream& strm, clock& c)

Код
ostream& operator<<(ostream& strm, const clock& c)




--------------------
user posted image
PM MAIL   Вверх
yngwie19
Дата 4.10.2008, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



IKM2007,  Спасибо за разъяснение Я все понял, только почему когда Я вместо 
Код

using std::ostream;
using std::istream;
using std::cout;
using std::cin;

ставлю просто
Код

using namespace std;

он мне выдает кучу ошибок и почему-то говорит что у меня нет доступа к закрытым элементам класса, хотя функция объявлена другом?


Это сообщение отредактировал(а) yngwie19 - 4.10.2008, 09:46
PM MAIL   Вверх
IKM2007
Дата 4.10.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



yngwie19, никаких ошибок не должно быть. Можешь кинуть весь код?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
yngwie19
Дата 4.10.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



попробуй поставь using namespace std, реально ошибки сразу, VS 6.0

Это сообщение отредактировал(а) yngwie19 - 4.10.2008, 11:43
PM MAIL   Вверх
IKM2007
Дата 4.10.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(yngwie19 @  4.10.2008,  11:43 Найти цитируемый пост)
попробуй поставь using namespace std, реально ошибки сразу, VS 6.0

У меня VS 2005 , но и на 6.0 не должно дать ошибки(в универе пишу на 6.0, и все OK). smile 
Какие ошибки дает?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
yngwie19
Дата 4.10.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(19) : error C2248: 'x' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(12) : see declaration of 'x'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(21) : error C2248: 'y' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(13) : see declaration of 'y'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(26) : error C2248: 'x' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(12) : see declaration of 'x'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(26) : error C2248: 'y' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(13) : see declaration of 'y'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(31) : error C2593: 'operator >>' is ambiguous
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(32) : error C2593: 'operator <<' is ambiguous

Добавлено через 8 минут и 14 секунд
а когда подключаю <iostream.h>, (без using namespace std естественно), то все работает, почему так?
PM MAIL   Вверх
J0ker
Дата 4.10.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата

C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(19) : error C2248: 'x' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(12) : see declaration of 'x'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(21) : error C2248: 'y' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(13) : see declaration of 'y'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(26) : error C2248: 'x' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(12) : see declaration of 'x'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(26) : error C2248: 'y' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(13) : see declaration of 'y'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(31) : error C2593: 'operator >>' is ambiguous
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(32) : error C2593: 'operator <<' is ambiguous

не class clock а struct clock

Добавлено через 8 минут и 57 секунд
Цитата(yngwie19 @  4.10.2008,  12:31 Найти цитируемый пост)
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(31) : error C2593: 'operator >>' is ambiguous
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(32) : error C2593: 'operator <<' is ambiguous

clock - это стандартная функция из time.h
либо уберите свой класс clock в неймспейс либо используйте другое имя

Добавлено через 10 минут и 12 секунд
Цитата(yngwie19 @  4.10.2008,  12:31 Найти цитируемый пост)
а когда подключаю <iostream.h>, (без using namespace std естественно), то все работает, почему так? 

потому, что не <iostream.h>, а просто <iostream> - это разные вещи

Это сообщение отредактировал(а) J0ker - 4.10.2008, 20:32


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 4.10.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Код

#include <iostream>

using namespace std;

struct my_clock_t          // Простая структура данных
{
    int hr, min, sec;
    my_clock_t(): hr(0), min(0), sec(0) {}
    my_clock_t(int h, int m, int s): hr(r), min(m), sec(s) {}
};

istream & operator >> (istream & in, my_clock_t &r)
{
    cout<<"Enter h, m, s:\nh=";
    in>>r.hr;
    cout<<"m=";
    in>>r.min;
    cout<<"s=";
    in>>r.sec;
    return in;
}
ostream& operator << (ostream& out, const my_clock_t &r)
{
    return  out << r.hr << ":" << r.min << ":" << r.sec << endl;
}
void main()
{
    my_clock_t a;
    cin>>a;
    cout<<a;
}


Это сообщение отредактировал(а) J0ker - 4.10.2008, 20:52


--------------------
user posted image
PM MAIL   Вверх
IKM2007
Дата 4.10.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата

C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(19) : error C2248: 'x' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(12) : see declaration of 'x'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(21) : error C2248: 'y' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(13) : see declaration of 'y'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(26) : error C2248: 'x' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(12) : see declaration of 'x'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(26) : error C2248: 'y' : cannot access private member declared in class 'T'
        C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(13) : see declaration of 'y'
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(31) : error C2593: 'operator >>' is ambiguous
C:\Program Files\Microsoft Visual Studio\MyProjects\1\main.cpp(32) : error C2593: 'operator <<' is ambiguous


J0ker, а где здесь слово clock?


Цитата(J0ker @  4.10.2008,  20:31 Найти цитируемый пост)
не class clock а struct clock

не имеет значения, если функция дружественная.



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 4.10.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(IKM2007 @  4.10.2008,  21:04 Найти цитируемый пост)
J0ker, а где здесь слово clock?

предполагаю, что Joker сделал телепатическое заключение на основе этой строки :
Цитата(IKM2007 @  4.10.2008,  21:04 Найти цитируемый пост)
'operator <<' is ambiguous

ну и как дополенение то, что кроме clock не объявлены никакие пользовательские классы (которые могут вызвать этот конфликт)  smile 




--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 4.10.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



урааааа. Загрузил последний Сервис-пак и все заработало, наверно был глюк VC
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1189 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.