![]() |
|
Модераторы: bsa |
![]()
|
|
| Capella |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.7.2008 Репутация: нет Всего: нет |
В С++ я новичок. Читаю Роберта Лафоре "ООП в С++" и выполняю упражнения. В главе 9 "Наследование" упражнении 7 сказано использовать листинг из начала главы и добавить возможность префиксного инкременирования и декреминирования используя наследование.
сообщение Visual Studia 2008 об ошибке (в случае с "++с1;"): error C2675: unary '++' : 'Countpost' does not define this operator or a conversion to a type acceptable to the predefined operator Помогите решить проблему пожалуйста))) Это сообщение отредактировал(а) Capella - 19.7.2008, 11:40 |
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Ты перегрузил только для постфиксного инкремента/декремента, а используешь еще и префиксный, значит нужно и для него определить опрерации
Практикуй отступы - код читать невозможно! Используй кнопку "КОД", она №5 над окошком для отправки сообщения Это сообщение отредактировал(а) Annihilator - 19.7.2008, 09:21 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| Capella |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.7.2008 Репутация: нет Всего: нет |
Это же наследование. Если я буду перегружать каждую операцию, то смысла в нём нет. Просто заново класс написать и всё.
Плюс если создать экземпляр класса CountDn и применить к нему операцию инременирования описанную в родителе, то ошибки не будет, что в листинге отражено: CountDn c2; ++c2; P.S. Сорри за отступы))) |
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Ты в своем примере перегрузил только для постфиксного оператора (с++), но используешь-то ты еще и префиксный (++с), а это разные вещи, разные механизмы. Почитай чем отличаются. Ты должен дополнить свой код перегрузкой префиксной формы, иначе компилятор не врубится, что ты от него хочешь!
ИМХО Лафоре - далеко не лучшая книга для новичков, как-то там все непоследовательно. Возьми лучше "Шилдт - С++ Базовый курс", сразу въедешь!
криво распознал Это сообщение отредактировал(а) Annihilator - 19.7.2008, 11:21 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| Capella |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.7.2008 Репутация: нет Всего: нет |
Смотри внимательно. Префиксное инременирование перегружено в самом первом классе, который является родителем CountDn, в котором перегружен префиксный декремент. Ну а мой класс Countpost перегружает оставшиеся операторы постфиксного инкременирования и декременирования. Так как мой класс наследник CounDn, который в свою очередь наследник класса Counter, то он (мой класс) должен был унаследовать префиксные операторы.
P.S. Чем отличаются я знаю))) . И кстати компилятор использует операцию постфиксную вместо префиксной, если не нашёл таковую. И наоброт. Проверено... Вот док-во: warning C4620: no postfix form of 'operator ++' found for type 'CountDn', using prefix form Я не много изменил код, чтобы показать это. В том коде, который я представил тут, данного ворнинга нету. Это сообщение отредактировал(а) Capella - 19.7.2008, 11:42 |
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Если обьявлена только префиксная операция, то компилятор использует ее и как поствиксную, но если обьявлена только поствиксная операция, то она используется только как поствиксная. Это сообщение отредактировал(а) IKM2007 - 19.7.2008, 12:19 -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| Capella |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.7.2008 Репутация: нет Всего: нет |
Вообще-то я это и написал. Только проблема в том, что у меня ВСЁ объявлено, а использует он только свои операторы. Хотя экземпляр класса CountDn с успехом использует как свой оператор, так и оператор родителя.
|
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Вот сама проблема.
но если постфикс написать в базовом классе, а префикс в производном, то сработает.Сам не знаю, почему так. -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| Capella |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.7.2008 Репутация: нет Всего: нет |
попробуй теперь 3 класс от второго сделать... и его экземпляром вызвать операторы. Не получается. В том-то и дело что пример с 2 классами базовым и наследником работает. А вот пример с базовым, наследником и наследником наследника нет...
|
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Capella,
я не говорю, что мой код компилируется. Я привел этот код,потому что в этом проблема в твоем коде, то есть если в базовом классе есть префиксная операция, а в производном постфиксная, тогда для обьекта производного класса не выполняется префиксная операция. Это сообщение отредактировал(а) IKM2007 - 19.7.2008, 14:05 -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| Capella |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.7.2008 Репутация: нет Всего: нет |
и правда странно.
P.S. Главный вопрос открыт. Почему не работает, так как показано в самом начале? |
|||
|
||||
| Annihilator |
|
||||||||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
вот так надо
Всем кому интересно, читаем здесь А конкретно для этого примера, цитирую
Это сообщение отредактировал(а) Annihilator - 19.7.2008, 20:33 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
||||||||
|
|||||||||
| Capella |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.7.2008 Репутация: нет Всего: нет |
Спасибо огромное
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |