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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка оператора <<, ну или >> 
:(
    Опции темы
versus
Дата 26.5.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



имеется вот такая простая программа

Код

#include <iostream>
using std::ostream;
using std::cout;
using std::endl;

class test
{
    int x;

public:
    test(int my_x): x(my_x) {}

    friend ostream& operator<<(ostream& stream, const test& obj);
};

ostream& operator<<(ostream& stream, const test& rhs)
{
    stream << rhs.x << endl;

//    return stream;
}

int main()
{
    test t(10);

    cout << t << endl;
    cout << endl << t;

    return 0;
}


Говорят, что в 20-ой строчке нужно обязательно возвращать ссылку на поток, чтобы operator<< можно было использовать в сложных (составных) выражениях. Действительно этот код, с закоментированной 20-ой строчкой с -Wall компилироваться отказывается по понятным причинам. Однако без -Wall поведение программы что с 20-ой строчкой, что без нее -- одинаковое.

Но если я не верну ссылку на поток в перегруженной функции, то куда тогда отправится endl в 27 строчке?
PM MAIL WWW   Вверх
Mayk
Дата 26.5.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Что значит куда? Туда, куда ему укажут. Функции operator<< возвращает значение допустим в EAX(что справедливо для 32 битных машин аля ix86). Соответственно туда он и отправит. Теперь попрубуем определить, чему он равняется. Разумеется он undefined в общем случае, но нас волнуют частности. В твоей функции есть лишь одна строка:

stream << rhs.x << endl;

Как думаешь, чему равняется eax после ее выполнения? Правильно, eax равен stream'у, т.к. stream<<endl возвращает значение. А так как больше твоя функция больше ничего не делает, то eax не меняется и потому эта функция возвращает stream.
Надеюсь понятно объяснил

Хотя в любом случае, это не оправдание чтобы забивать на return stream;




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
versus
Дата 26.5.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ага, понятно.

После того как убрал из функции

stream << rhs.x << endl;

программка как и следовало ожидать свалилась в сегфолт.

спасибо.
PM MAIL WWW   Вверх
yours-tester
Дата 31.5.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дополнительный вопрос к теме.
Если в этой програмке заменить несколько первых строчек вот так:

Код

#include <iostream>
using namespace std;

//using std::ostream;
//using std::cout;
//using std::endl;


то она перестаёт компилироваться, а по моему должна.
Не пойму почему? Может кто подскажет?
--------------------Configuration: Test - Win32 Debug--------------------
Compiling...
test-1.cpp
D:\docs\Work\VC++\Test\test-1.cpp(20) : error C2248: 'x' : cannot access private member declared in class 'test'
D:\docs\Work\VC++\Test\test-1.cpp(10) : see declaration of 'x'
D:\docs\Work\VC++\Test\test-1.cpp(29) : error C2593: 'operator <<' is ambiguous
D:\docs\Work\VC++\Test\test-1.cpp(30) : error C2593: 'operator <<' is ambiguous
Error executing cl.exe.

test-1.obj - 3 error(s), 0 warning(s)[code=cpp]




PM MAIL   Вверх
versus
Дата 31.5.2005, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



без пол-литр... тьфу-ты, без сурса test-1.cpp тут не разобраться...

>Если в этой програмке заменить несколько первых строчек вот так:
Очевидно в программке что-то изменили кроме первых строчек. Чем объяснить ругань на приватную x при доступе к ней из дружественной функции класса?

Это сообщение отредактировал(а) versus - 31.5.2005, 18:38
PM MAIL WWW   Вверх
Mayk
Дата 31.5.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



yours-tester
Код

friend ostream& operator<<(ostream& stream, const test& obj);

Про дружбу не забыл?




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
yours-tester
Дата 1.6.2005, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как ни странно про дружбу не забыл.
Текст программы изменился только в первых строчках как указано.
PM MAIL   Вверх
Mayk
Дата 1.6.2005, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Хмм. У меня все сработало.
Давай весь код в студию, посмотрим. И еще - что-за компилятор?

Это сообщение отредактировал(а) Mayk - 1.6.2005, 08:34


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
yours-tester
Дата 1.6.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот он.
Код

#include <iostream>
using namespace std;

//using std::ostream;
//using std::cout;
//using std::endl;

class test
{
int x;

public:
test(int my_x): x(my_x) {}

friend ostream& operator<<(ostream& stream, const test& obj);
};

ostream& operator<<(ostream& stream, const test& rhs)
{
stream << rhs.x << endl;

 return stream;
}

int main()
{
test t(10);

cout << t << endl;
cout << endl << t;

return 0;
}


Компилятор VC++ 6.0 Я раньше с такой проблемой уже сталкивался, но в чём причина так и не понял. А тут гляжу похожий случай. Проверил. Та же проблема.
Стоит вместо трёх операторов using std::* применить один using namespace std, как программа перестаёт компилироваться. Если же использовать заголовки из глобального пространства h, то опять всё нормально.
PM MAIL   Вверх
Alastis
Дата 1.6.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

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



вывод - пора переходить на VC 7.1, там все это компилируется без проблем


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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