1 |
cout << 77; |
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 |
//Листинг #1 Перегрузка операции << Возникновение необходимости clang #include <iostream> using namespace std; class MyInt{ int value; public: /*ФУНКЦИЯ ДЛЯ УСТАНОВКИ ЗНАЧЕНИЯ В value*/ void set_value(const int x) { value = x; } /*ФУНКЦИЯ ДЛЯ ВЫТАСКИВАНИЯ ЗНАЧЕНИЯ ИЗ value*/ int get_value() const{ return value; } }; int main(){ MyInt temp; temp.set_value(100); cout << temp; //класс MyInt не умеет операцию << } |
1 |
cout << temp; |
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 31 32 |
//Листинг #2 Перегрузка операции << clang #include <iostream> #include <cstdlib> using namespace std; class MyInt{ int value; public: /*ФУНКЦИЯ ДЛЯ УСТАНОВКИ ЗНАЧЕНИЯ В value*/ void set_value(const int x) { value = x; } /*ФУНКЦИЯ ДЛЯ ВЫТАСКИВАНИЯ ЗНАЧЕНИЯ ИЗ value*/ int get_value() const{ return value; } void operator << (ostream& object){ object << value; } }; int main(){ MyInt temp; temp.set_value(100); temp << cout; //В операции << доминирует объект temp над объектом cout, теперь так работает //cout << temp; //но так не работает } |
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 31 32 |
//Листинг #3 Перегрузка операции << clang #include <iostream> using namespace std; class MyInt{ int value; public: /*ФУНКЦИЯ ДЛЯ УСТАНОВКИ ЗНАЧЕНИЯ В value*/ void set_value(const int x) { value = x; } /*ФУНКЦИЯ ДЛЯ ВЫТАСКИВАНИЯ ЗНАЧЕНИЯ ИЗ value*/ int get_value() const{ return value; } friend void operator << (ostream& object, MyInt temp){ object << temp.get_value(); //<--- будьте внимательны, temp наш объект, элементы которого надо вытаскивать с помощью предназначенного для этого метода } }; int main(){ MyInt temp; temp.set_value(100); //temp << cout; //В операции << доминирует объект temp над объектом cout, теперь так не работает (мы убрали подходящую под это перегрузку, чтобы не наломать дров) cout << temp; //но так работает, привычно и достаточно удобно } |
1 2 3 |
friend void operator << (ostream& object, MyInt temp){ cout << temp.get_value(); //<--- будьте внимательны, temp наш объект, элементы которого надо вытаскивать с помощью предназначенного для этого метода } |
1 2 3 4 5 6 |
int main(){ MyInt temp; temp.set_value(100); cout << temp; //Так ОК cout << temp << temp; //Так ошибка. |
1 2 3 |
int х = 5; int у = 8; cout << х << у; |
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 31 32 33 34 35 |
#include <iostream> using namespace std; class MyInt{ int value; public: /*ФУНКЦИЯ ДЛЯ УСТАНОВКИ ЗНАЧЕНИЯ В value*/ void set_value(const int x) { value = x; } /*ФУНКЦИЯ ДЛЯ ВЫТАСКИВАНИЯ ЗНАЧЕНИЯ ИЗ value*/ int get_value() const{ return value; } friend ostream& operator << (ostream& object, const MyInt& temp){ //<--- немного изменили параметры, так правильней. объект temp тоже лучше по ссылке, а ещё лучше по константной //работать будет и без этого, просто это технчиней, т. е. лучше return object << temp.get_value(); //<--- возвращаем объект-поток, тип которого ostream } }; int main(){ MyInt temp; temp.set_value(100); //temp << cout; //В операции << доминирует объект temp над объектом cout, теперь так не работает (мы убрали подходящую под это перегрузку, чтобы не наломать дров) cout << temp << '\n'; //но так работает, привычно и достаточно удобно cout << temp << '\n' << temp << '\n' << temp << '\n'; //Теперь работает и цепочкой!!! } |
Добавить комментарий