![]() |
|
Модераторы: Poseidon |
![]()
|
|
| Mcicool |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 9.10.2005 Репутация: нет Всего: нет |
Как сделать тоже самое, только без использования слова "friend" ???
|
|||
|
||||
| Kuvaldis |
|
||||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Mcicool,
Можно заменить только те friend функции, где левый операнд является объектом класса real. Т,е. заведомо не получится перегрузить << и >>. Теперь один пример, как перегрузить деление (остальное делается по аналогии)
В общем, идея в следующем: метод вызывается для объекта класса, который у тебя раньше назывался a. ТАк как метод объекта, то к данных объекта можно обращаться напрямую, без явного указания this->a. Указатель this - указывает на объект, чей метод был вызван. Можно было просто взять твой старый код и заменить везде a. на this-> Еще один момент
Здесь пришлось явно указывать на объект, иначе его не вызвать Замечания: 1. В функцию лучше все объекты передавать как константные ссылки, const real& b. Не тратится память на копирование объектов в стек. 2. в свои старые функции ты передавал объекты по значению (через стек). Поэтому те изменения, которые ты для них делал, проявлялись только в перегруженной функции. Здесь же так сделать нельзя (иначе получится перегруженная функция +=) Если мы изменим данные объекта, то именения сохранятся. Поэтому создаем локальную переменную temp, к которой уже и применяем необходимые операции Кстати, перегруженная операция объявлена как const, что является дополнительной защитой на этапе компиляции от изменения объекта, чей метод был вызван (если мы решили, что у нас не операция +=, то левый операнд измениться не должен) Ах да, в описании класса данный метод будет выглядеть так:
Это сообщение отредактировал(а) Kuvaldis - 13.11.2006, 12:38 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||||
|
|||||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Kuvaldis, просто интересно, а почему ты сложение перегрузил operator * ?
З.Ы. просто интересно -------------------- <удалено администрацией форума> |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
EvgenZ,
Ну, э... так получилось, уже исправил... Конечно, можно и математическую теорию подбить: ведь умножение - это многократное сложение, а я просто слово "многократное" пропустил -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Mcicool |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 9.10.2005 Репутация: нет Всего: нет |
Kuvaldis
Большое спасибо, но по-моему ты перегрузил оператор деления все таки Но, все равно, я понял как делать, большое спасибо! Это сообщение отредактировал(а) Mcicool - 13.11.2006, 11:39 |
|||
|
||||
| Mcicool |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 9.10.2005 Репутация: нет Всего: нет |
А вы мне можете обьяснить в каком случае у меня вызывается каждый конструктор? А то их чисто интуитивно понаписал, а сути не понимаю.
Добавлено @ 16:18 И еще можно пример, как переделать сложение, а то у меня чето не поулчается... |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Mcicool,
сложение:
Если хочешь посмотреть, когда вызывается конструктор (при создании объекта), то в теле конструктора пропиши что-нибудь типа cout << "Constructor" << и программу по шагам... При передаче объекта класса по ссылке используется конструктор копий (у тебя он по умолчанию, страндартный) Это сообщение отредактировал(а) Kuvaldis - 13.11.2006, 17:01 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
Kuvaldis,
+, -, *, / лучше реализовывать через +=, -=, *=, /= не функциями-членами -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
MAKCim,
я знаю и в своих классах так всегда и делаю, но человек попросил так
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| Mcicool |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 9.10.2005 Репутация: нет Всего: нет |
А вы можете показать, как сделать по-вашему? Я на самом деле ищу наилучший вариант.
|
|||
|
||||
| Mcicool |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 9.10.2005 Репутация: нет Всего: нет |
И еще вопрос по контсрукторам:
Как предусмотреть все конструкторы, чтобы была возможность использовать в арифметических выражениях с объектами класса real операнды всех базовых арифметических типов?? Разве моих не хватает? |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Mcicool,
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Mcicool |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 9.10.2005 Репутация: нет Всего: нет |
Kuvaldis. Спасибо, что помогаете.
Но я вынужден опять обратиться с вопросом. Как сделать так, чтобы пользователь мог вводить в качестве первого и второго операнда либо одно число (тип double или тип int), либо он может ввести число типа real (мантиссу и характеристику). Сейчас ведь как работает: Сначала вводим первый операнд, он должен обязательно быть типа real (мантисса и характеристика), потом вводим второй операнд (ти double), потом операцию, а дальше программа все счиате и выводит. А мне надо, чтобы пользователь не был ограничен в средствах . По идее программа должна распозновать, что он ввел, либо real, либо обычное число. Очень нужна помощь в этом вопросе. Спасибо. |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Mcicool,
Так не получится при вводе информации численного типа. Выход один: перед вводом информации запрашивать у пользователя, в каком виде он хочет вводить данные. Еще, как вариант, можно рассмотреть ввод числа как строки: т.е. "12345" - это без экспоненты "12,345 Е 3" - = 12,345 * 10^3 Но анализ посложнее будет, чем у тебя сейчас есть... Это сообщение отредактировал(а) Kuvaldis - 16.11.2006, 03:01 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Mcicool |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 9.10.2005 Репутация: нет Всего: нет |
Може т читать вводимые значения, как символы. Например, цикл:
Просто я никак не могу нормально еализовать... |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |