1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
|
|
1 | |
Перегрузка operator<<17.02.2011, 00:10. Показов 8993. Ответов 40
Метки нет (Все метки)
Доброе время суток.
Есть очередная задачка - перегрузить оператор вывода таким образом: Есть три объекта разных классов - А а, В в, С с; Нужно, чтобы при записи а << b << c; изменялось значение некоторых членов всех трех классов, ну грубо говоря, пусть там есть по одному члену типа float и пусть при такой записи вывода произойдет нечто вроде b.f+=0.2*c.f; a.f+=0.8*c.f; А при любой другой записи - (b<<c<<a, c<<b<<a, b<<a<<c, a<<b<<a) - пусть проводится просто вывод каких-нибудь членов класса, не суть важно. Или даже ошибка за неправильный порядок членов в выводе. Можно ли это вообще сделать, а если нельзя, то что требуется от этих трех объектов? Точно известно, что речь про перегрузку вывода, а не перегрузку сдвига. С перегрузкой я знаком, но вызывает затруднение именно такой порядок и вообще, наличие 3х объектов, о которых идет речь.
0
|
17.02.2011, 00:10 | |
Ответы с готовыми решениями:
40
Перегрузка operator>> и operator<< в абстрактном классе Перегрузка operator= Перегрузка operator<< Перегрузка operator= |
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
17.02.2011, 00:15 | 2 |
https://www.cyberforum.ru/cpp-... print.html
friend функция С++ на MSVC 6.0 https://www.cyberforum.ru/cpp/thread162537.html посмотрите, подобное уже решалось
0
|
1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
|
|
17.02.2011, 08:56 [ТС] | 3 |
Немного не то.
Я хочу не просто перегрузить оператор в трех классах, а сделать так, чтобы перегруженная операция выполнялась только в случае определенного порядка трех объектов разных классов: Или даже так - для a<<b<<c выполняется одна версия cout, для любого другого a<<b, b<<a<<c, c<<b<<a - другая.
0
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
17.02.2011, 09:04 | 4 |
Невозможно это.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||||||
17.02.2011, 13:50 | 5 | |||||
Если раскомментировать какие-либо из закомментированных выражений, то выдает ошибку:
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.02.2011, 14:47 | 6 |
Mr.X, ТСу вроде надо было перегрузить оператор передачи в поток (для которого первым операндом является экземпляр std::ostrem), а не просто оператор сдвига.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
17.02.2011, 15:15 | 7 |
У автора вот так написано:
Да и перегрузить можно только встроенный оператор, а оператор вывода «<<» - это перегрузка оператора сдвига.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|||||||||||
17.02.2011, 15:21 | 8 | ||||||||||
вот мой вариант
про изменение полей объектов, тут уже в каждом операторе отдельные действия
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.02.2011, 16:51 | 9 |
Mr.X,
А ещё у автора написано Ну вы ведь меня поняли и просто придираетесь, правда? Ладно, для большей конкретики так: "ТСу нужна была реализация перегрузки оператора сдвига влево для передачи своего правого операнда в поток, представляемый левым операндом, плюс выполнить некие дополнительные действия."
0
|
1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
|
|
17.02.2011, 18:15 [ТС] | 10 |
silent_1991: Вы очень круты. Я и сам не знал, что мне нужно именно это!
Ведь правда - мне конечно нужна реализация оператора вывода. Однако реализация сдвига, которая будет выводить - это вообще супер. Дальше уже понятно, как это доработать, спасибо.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.02.2011, 18:32 | 11 |
Никогда тугодумом не был, но немного не понял - это что, сарказм? Если нет - извиняюсь. А если так - то я основывался именно на вашей фразе
Суть в том, что оператор << и есть оператор сдвига влево, просто для класса basic_ios (вроде для него, ну или для производных) он перегружен как оператор вывода в поток.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
17.02.2011, 18:54 | 12 |
оператора вывода просто не существует)
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.02.2011, 19:09 | 13 |
alex_x_x, ну ведь на нашем уровне абстракции мы имеем право "забыть", что в контексте ввода/вывода используются именно операторы сдвигов и для понятности называть их операторами ввода/вывода.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
17.02.2011, 19:14 | 14 |
silent_1991, так же как == != для объектов -> для умных указателей, [] для множеств итп
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.02.2011, 19:18 | 15 |
alex_x_x, не понял аналогии, все приведённые вами операции работают в соответствии с их назначением в, так сказать, реальной жизни. Операторы сравнения действительно сравнивают, а оператор индексации действительно даёт доступ к нужному элементу. А вот сдвиг работает не так, как надо, он не сдвигает, а выполняет иную функцию. Поэтому я и предлагаю чисто формально "забыть", что это именно оператор сдвига)))
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
17.02.2011, 19:22 | 16 | |||||
если определен operator==( .. ) то он может делать что угодно, кроме сравнение адресов объектов
std::vector<T>::operator[] как связан с сишным a[x] <==> *(a+x) ?
еще оператор = как конструктор копирования
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.02.2011, 19:30 | 17 |
alex_x_x, ну вот, оказывается, мы о разных вещах говорим))) Вернее находимся на разных уровнях абстракции. Нам ведь важно то, что применив к экземпляру std::vector оператор [] мы получим необходимый элемент массива. Т.е. будет сымитировано поведение сырого массива. Нам же не обязательно знать, что для сырого сишного массива компилятор развернёт arr[i] в *(arr + i), а при применении вектора будет вызвана функция arr.operator[](i). Нам важно, что интерфейс совпадает, и мы вправе ожидать одинакового поведения. Вот об этом я и говорю.
Добавлено через 2 минуты Нет, понятно, что мы можем перегрузить большинство операторов, как нам заблагорассудится, но я говорю о разумном использовании перегрузки. Например, конкатенация строк. Ведь интуитивно понятнее использовать для этого оператор сложения, чем отдельную функцию. Вот что я имею ввиду под разумным использованием))) То же и для <</>>. Тут просто интуитивно понятное действие.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
17.02.2011, 19:38 | 18 |
я и не против
просто есть в программирование такое понятие как оператор и оно не связано с этими абстракциями бинарный оператор a * b унарный * a и нет разницы a << b где a b два числа или a - std::cout и b std::string семантика одинакова, один оператор в разных контекстах приведет к разным действиям компилятора
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.02.2011, 19:42 | 19 |
alex_x_x, да, а есть ещё ассемблер и машинный код, который вообще с регистрами да аккумуляторами работает (грубо). Так что нам уровень абстракции всё-таки важен. Верите, нет, но мне в контексте std::cout << str; легче оператор << называть оператором передачи в поток, чем оператором сдвига, и что язык ни о каком таком операторе вывода не знает, мне как-то по-барабану. Главное, что о нём знаю я, и смысл его мне понятнее, когда я его оператором вывода называю. Вот как-то так...
P.S. Главное знать, где, как и что правильно обозвать, чтобы потом не было мучительно больно за непонимание, какого чёрта "оператор вывода" делает в выражении a = b << 3; Ну и плюс к этому, я бы и не заикался на эту тему, говори мы о Си, и не называл бы функцию printf оператором вывода.
0
|
1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
|
|
17.02.2011, 19:44 [ТС] | 20 |
Не, не сарказм, искреннее восхищение.
Просто не знал этой части и всегда считал сдвиг в операторах вывода некой идиомой плюсов.
0
|
17.02.2011, 19:44 | |
17.02.2011, 19:44 | |
Помогаю со студенческими работами здесь
20
Перегрузка operator[][][] Перегрузка operator+ Перегрузка operator->() Перегрузка operator new Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |