Че-та где-та я подтупливаю с перегрузкой оператора
- Войдите на сайт для отправки комментариев
Вс, 07/06/2020 - 17:10
Ну собственно есть родительский класс, и дочерний. Пытаюсь перегрузить оператор = так, чтобы члены дочернего класса инициировать родительским.
class Parent{ protected: float a; float b; float c; public: }; class Sub: public Parent{ protected: float d; public: Sub& operator=(Parent& src){ a = src.a; b = src.b; c = src.c; d = 0; return *this; } }; void setup() { // put your setup code here, to run once: } void loop() { Parent aaa; Sub bbb; bbb = aaa; }
А в ответ :
sketch_jun07a:3: error: 'float Parent::a' is protected float a; ^ sketch_jun07a:16: error: within this context a = src.a; ^ sketch_jun07a:4: error: 'float Parent::b' is protected float b; ^ sketch_jun07a:17: error: within this context b = src.b; ^ sketch_jun07a:5: error: 'float Parent::c' is protected float c; ^ sketch_jun07a:18: error: within this context c = src.c; ^ exit status 1 'float Parent::a' is protected
что за фигня? Где я накосячил, подскажите плз. Я могу , конечно , метод инициации написать, но истина как бэ дороже! :)
ПС. Предвосхищая события: читать сообщение умею, но смысл написанного ускользает! :) И что, что протектед? Класс Sub ведь дочерний, вроде.
Заменить надо public Parent -> private Public, вроде.
Я особо не вникал, но как понимаю - прогонять protected через public бессмысленно, так как идёт понижение "уровня защиты".
Напиши friend class Sub; в базовом.
Сделано это потому, что аргумент типа Base может быть другой ветвью наследования. Например, если ты создал class Sub2: private Base, то передав его в функцию можно было бы читать его методы, хотя они объявлены как private в Sub2.
Напиши friend class Sub; в базовом.
Конечно иной. Потому и работает.
Конечно иной. Потому и работает.
в:
1вых) спасибо, что тратите свое время и вдохновение :)
2ых) подозреваю, что это решение есть костылем, который работает, но которых стоит избегать
3их) я до сих пор не понял, это я не правильно применяю наследование, или в силу каких-то причин это не так работает, как описывает товарищ Лафоре?
так не работает. Не понял в чем бессмысленность: protected у родительского класса доступны у дочернего, и не доступны извне. по крайней мере так должно быть, кмк.
Так не покатит? http://cpp.sh/6stlt
Итак, что говорит стандарт: члены производного класса могут добираться к protected членам базового
1. либо через свой указатель this (правильный пример):
2. либо, когда тип экземпляра определён ОДНОЗНАЧНО как такой же, как тип экземпляра в котором происходит обработка - безо какой бы то ни было вероятности, что он на самом деле преобразован из чего-то ещё (это то, о чём писал rkit). Правильный пример, как можно написать в Вашем случае:
но вот это как раз костыль, т.к. мы преобразовываем сущность к тому, чем она на самом деле не является.
Что же касается friend, который Вам посоветовали - это не костыль, это "лом против которого нет приёма" / "пушка по воробьям", но не костыль.
Чем плох friend? Тем, что он даёт доступ ко всем (даже private) членам класса Parent всем (а не только оператору присваивания) членам класса Sub. Это несколько неоправданное расширение прав доступа.
2ых) подозреваю, что это решение есть костылем, который работает, но которых стоит избегать
3их) я до сих пор не понял, это я не правильно применяю наследование, или в силу каких-то причин это не так работает, как описывает товарищ Лафоре?
2. Не переусложняй.
3. Я объяснил, почему оно работает так как работает.
Хотел написать про контекст, но Петрович, как обычно, опередил :)
Так не покатит?
Не просто прокатит, а это есть правильное решение - без "ломовости" friend, и без костыля с преобразованием указателя.
Если сравнивать это решение с friend, то можно сказать, что там топор, а здесь скальпель.
так не работает. Не понял в чем бессмысленность: protected у родительского класса доступны у дочернего, и не доступны извне. по крайней мере так должно быть, кмк.
Да, я из леса писал, писал и описался: "private Parent", а не "private Public".
"лом против которого нет приёма" / "пушка по воробьям", но не костыль.
Чем плох friend? Тем, что он даёт доступ ко всем (даже private) членам класса Parent всем (а не только оператору присваивания) членам класса Sub. Это несколько неоправданное расширение прав доступа.
Если хочется во что бы то ни стало сделать свою собственную жизнь кошмаром, ставля перед самим собой барьеры и бюрократию, то френдом можно объявить не весь класс, а только отдельный метод.
Да я понял :)
1) через friend - как я уже писал, работает, спасибо rkit ! может я неправ, но это уже ближе к зависимости, чем к чистому наследованию.
2) через приведение ссылки на объект, работает, спасибо ЕвгенийП !
результат: 100.00 200.00 300.00 400.00
3) идея с перегрузкой оператора = в родительском классе вроде бы понятна. Спасибо, DIYMan.но так в лоб не работает
поля a, b, c остаются равны нулю . Видимо надо что-то делать с объектом родительского класса, возвращаемого в ф-ию перегрузки дочернего класса. а то он улетает в никуда, как я понял. К сожалению на сегодня мои опыты закончились: после очередной загрузки скетча в девайс на проце ATSAM3x8e слетел бутлоадер Due, поэтому он временно окирпичился. :)
Если хочется во что бы то ни стало сделать свою собственную жизнь кошмаром, ставля перед самим собой барьеры и бюрократию, то френдом можно объявить не весь класс, а только отдельный метод.
5N62V, поставь Codelite, не мучай МК. Тут чистая работа с плюсами - можно все понять быстрее и проще, исполняя код на ПыКа.
поля a, b, c остаются равны нулю .
Эммм, а кто будет писать тело оператора присваивания родительского класса? Я там только, пардон, пустой тампон оставил. Вот, всё работает: http://cpp.sh/56ou6 - обратите внимание на тело функции Parent& operator=(const Parent& src) ;)
Выхлоп:
Здрасьте, девочки! А присваивание кто писать-то будет? У Вас же в операторе только вывод в сериал - он, наверняка работает.
Да, у меня вместе с бутлоадером кусочек мозга по-видимому слетел :)
Работает как надо
выдает: 100.00 200.00 300.00 400.00
обратите внимание на тело функции Parent& operator=(const Parent& src) ;)
Не обратил, но работает :)