С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Nishen
408 / 247 / 81
Регистрация: 26.02.2015
Сообщений: 1,155
Завершенные тесты: 2
#1

Пишем свой класс, спецификатор доступа protected - C++

09.07.2015, 18:43. Просмотров 1946. Ответов 61
Метки нет (Все метки)

Всем привет!
Из книги Р. Лафоре относительно спецификатора доступа protected:
Таким образом, если вы пишете класс, который впоследствии будет использоваться как базовый класс при наследовании, то данные, к которым нужно будет иметь доступ, следует объявлять как protected.
Далее пишется следующее:
Существуют и недостатки использования спецификатора доступа protected... это делает члены, объявленные как protected, значительно менее защищенными, чем объявленные как private.
Возникает вопросы: так когда же стоит использовать protected? Как я могу знать, захочет ли кто-нибудь использовать мой класс, как базовый? И как не доиграться со спецификаторами доступа? Как быть, если я хочу использовать чужой класс, но поля класса закрыты спецификатором private?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 18:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пишем свой класс, спецификатор доступа protected (C++):

Пишем свой чекер - C++
Я хочу написать свой чекер, но не знаю с чего начать? Кто знает основные принцип работы чекеров прошу объясните.

пишем свой троян с нуля - C++
Всем привет)))соглашусь, что изобретаю велосипед, но хочется сделать все своими ручками не прибегая к open source и т.п. для повышения...

Пишем свой интерпретатор языка BASIC - C++
***************** Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор...

Спецификатор доступа и виртуальные функции - C++
Как я понимаю, спецификатор доступа задается только в том классе, где функция объявляется виртуальной? Получается во время исполнения не...

Ключ доступа protected - C++
В каких случаях рекомендовано использовать этот ключ доступа? Если можно, то приведите примеры.:help:

protected или не protected : ) - C++
собстно не могу решить как поступить. есть абстрактный класс окошка, являющийся базовым для всех окошек. есть 3 варианта...

61
hoggy
6728 / 2913 / 499
Регистрация: 15.11.2014
Сообщений: 6,550
Завершенные тесты: 1
10.07.2015, 15:23 #46
Цитата Сообщение от ct0r Посмотреть сообщение
То есть вы даже Джоэла Сполски не читали? А гуглить умеете? Первая ссылка в поиске.
мне не интересны дешовые понты.
не пишите мне больше.
0
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
10.07.2015, 15:33 #47
Цитата Сообщение от Avazart Посмотреть сообщение
Да любой класс используемый, вопрос уровня. Для того и пишут классы- для возможности повторного использования, а не копипаста кода. Вот как раз отсутствие проверок и делает код непригодным к повторному использованию ибо "человек" должен слишком много знать об этом кривом классе и слишком много сделать проверок руками... и возможно окажется что легче будет писать с нуля нежели использовать этот класс.
Вообще не вижу проблем. Если у тебя такая ситуация, что на каждый чих что-то надо проверять, то либо оберни в свой, в котором будут проверки, либо воспользуйся уже такой готовой оберткой. Но изначально предоставлять класс со всеми проверками - не лучшая идея.

Цитата Сообщение от Avazart Посмотреть сообщение
А кого тогда эта ответственность?
Тот, кто его использует, обязан проверять, что он следует контракту используемого класса для того, чтобы получить гарантированное поведение.

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
мне не интересны дешовые понты.
не пишите мне больше.
Хорошо. Не вижу смысла вам писать, раз уж сами не можете потратить минуту на поиск информации. Я в няньки не нанимался.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
10.07.2015, 15:42 #48
Цитата Сообщение от ct0r Посмотреть сообщение
то либо оберни в свой
Зачем? Я так вряд ли поступлю... скорее я выкину тот класс и напишу свою реализацию с проверками зачем мне мараться.

Добавлено через 1 минуту
Цитата Сообщение от ct0r Посмотреть сообщение
Но изначально предоставлять класс со всеми проверками - не лучшая идея.
Не лучшая идея допускать UB cо старта.

Добавлено через 56 секунд
Цитата Сообщение от ct0r Посмотреть сообщение
Тот, кто его использует, обязан проверять, что он следует контракту используемого класса для того, чтобы получить гарантированное поведение.
Тому кто использует срать, он хочет получить желаемое, а не UB.
UB на то UB а не гарантированое повидение.

Если вы изначально UB приравниваете/(включаете) к гарантированному поведению то грош вам цена как программисту.

Понятно что есть некоторые упущения и "люфты" которые могут привести к UB при использовании библиотеки, но тем не менее не на каждом же шагу.
1
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
10.07.2015, 15:46 #49
Цитата Сообщение от Avazart Посмотреть сообщение
Зачем? Я так вряд ли поступлю... скорее я выкину тот класс и напишу свою реализации зачем мне мараться.
То есть для тебя читать документацию означает мараться? Ну ок Может с итераторов начнешь? А то класс итератора при разыменовании не проверяет, конечный он или нет. Там UB получается. Ну так как?

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Тому кто использует срать, он хочет получить желаемое, а не UB.
UB на то UB а не гарантированое повидение.
Если вы изначально UB приравниваете/(включаете) к гарантированному поведению то грош вам цена как программисту.
Понятно что есть некоторые упущения и "люфты" которые могут привести к UB при использовании библиотеки, но тем не менее не на каждом же шагу.
Оу, почитайте про DbC на досуге.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
10.07.2015, 15:49 #50
А при чем тут дока? Если кривая библиотека, то и получишь документацию к кривой библиотеке не более.

Цитата Сообщение от ct0r Посмотреть сообщение
Может с итераторов начнешь? А то класс итератора при разыменовании не проверяет, конечный он или нет. Там UB получается. Ну так как?
А с чего начинать со специализированных классов?
С таким же успехом можно было уже и назвать std::pair<> в котором члены класса открыты.

Вы ведь сами изначально привели пример с датой изначально так?
0
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
10.07.2015, 16:05 #51
Цитата Сообщение от Avazart Посмотреть сообщение
А при чем тут дока? Если кривая библиотека, то и получишь документацию к кривой библиотеке не более.
Библиотека не кривая. Если ты ее используешь не так, как задумано авторами (как задумано - написано в документации) - это твои личные проблемы. Библиотека ведет себя в полном соответствии с документацией. Почему тогда она кривая? Или по твоей логике, если белье сушится в микроволновке как-то странно, то это микроволновка кривая? Или все-таки проблема в том, что ты не прочитал, как ей пользоваться?

Цитата Сообщение от Avazart Посмотреть сообщение
А с чего начинать со специализированных классов?
С таким же успехом можно было уже и назвать std:air<> в котором члены класса открыты.
Вы ведь сами изначально привели пример с датой изначально так?
Везде есть контракт на вызов. И там, и там, тебе говорят, не вызывай, мол, такую-то функцию с такими-то данными, получишь фиг знает что!

Добавлено через 5 минут
PS Хочешь пользоваться микроволновкой, которая всегда перед нагревом целую минуту проверяет, положил ты туда еду или еще что?
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
10.07.2015, 16:19 #52
Цитата Сообщение от ct0r Посмотреть сообщение
но - написано в документации) - это твои личные проблемы. Библиотека ведет себя в полном соответствии с документацией. Почему тогда она кривая? Или по твоей логике, если белье сушится в микроволновке как-то странно, то это микроволновка кривая? Или все-таки проблема в том, что ты не прочитал, как ей пользоваться?
Если микроволновка выглядит полностью как стиральная машинка то да виноват разработчик и тут дока не при чем ибо ошибка допущена уже при покупке "инструмента".

Добавлено через 4 минуты
Цитата Сообщение от ct0r Посмотреть сообщение
PS Хочешь пользоваться микроволновкой, которая всегда перед нагревом целую минуту проверяет, положил ты туда еду или еще что?
Тем не менее не плохо бы что бы микроволновка не допускала включение при открытой дверце.
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 16:28 #53
Цитата Сообщение от ct0r Посмотреть сообщение
Библиотека не кривая. Если ты ее используешь не так, как задумано авторами (как задумано - написано в документации) - это твои личные проблемы
Не, по большому счету это проблема автора ибо я себе найду другую библиотеку, а вот его библиотекой будет пользоваться меньшей людей. Недостаточно просто написать доку, хороший интерфейс должен способствовать правильному использованию и сводить к минимуму возможности его использовать неправильно.
0
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
10.07.2015, 16:34 #54
Цитата Сообщение от Avazart Посмотреть сообщение
Если микроволновка выглядит полностью как стиральная машинка то да виноват разработчик и тут дока не при чем ибо ошибка допущена уже при покупке "инструмента".
Так кто все-таки виноват? Производитель или потребитель? А может в городе, в котором живет производитель, микроволновки выглядят как раз именно так, как у тебя стиральные машинки? Для того и существует документация - чтобы устранять непонимания между тем, кто производит, и тем, кто пользуется. Да и вообще это не наш случай. В нашем внешний вид практически один и тот же.

Цитата Сообщение от Avazart Посмотреть сообщение
Тем не менее не плохо бы что бы микроволновка не допускала включение при открытой дверце.
Даже если будет минуту определять, открыта она или нет? А как насчет определения, не нагреется ли за такое время еда больше, чем хочет потребитель? Или меньше? Говорю же, каждая ситуация имеет свои специфические особенности, которые надо учитывать. Поэтому говорить, что например, всегда куча проверок - это хорошо - неправильно.

Добавлено через 2 минуты
Цитата Сообщение от Voivoid Посмотреть сообщение
Не, по большому счету это проблема автора ибо я себе найду другую библиотеку, а вот его библиотекой будет пользоваться меньшей людей. Недостаточно просто написать доку, хороший интерфейс должен способствовать правильному использованию и сводить к минимуму возможности его использовать неправильно.
Да, верно. Но DbC мало как влияет на внешний вид API. Просто в одном случае проверки спрятаны внутри, а в другом - их нет, и неправильное использование ведет к UB. И для того, чтобы определить, есть они или нет, все равно нужно читать доку. Логично постоянно задаваться вопросом - а что будет, если я передам неверные данные? И ответ надо искать в документации, а не фантазировать.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
10.07.2015, 17:06 #55
Цитата Сообщение от ct0r Посмотреть сообщение
Так кто все-таки виноват?
Вина потребителя лишь в том что он купил фиговый инструмент.

Цитата Сообщение от ct0r Посмотреть сообщение
А может в городе, в котором живет производитель, микроволновки выглядят как раз именно так, как у тебя стиральные машинки?
Ну а если бы в рту росли грибы ....
С таким подходом все можно довести до абсурда.

Цитата Сообщение от ct0r Посмотреть сообщение
Для того и существует документация - чтобы устранять непонимания между тем, кто производит, и тем, кто пользуется.
К примеру, а если в моем городе не принято читать документацию?


Цитата Сообщение от ct0r Посмотреть сообщение
Даже если будет минуту определять, открыта она или нет? А как насчет определения, не нагреется ли за такое время еда больше, чем хочет потребитель? Или меньше? Говорю же, каждая ситуация имеет свои специфические особенности, которые надо учитывать. Поэтому говорить, что например, всегда куча проверок - это хорошо - неправильно.
У вас микроволновка определяет минуту?
В любом случае это лучше чем так позволяет работать с открытой дверцей, нарушая TБ.

Я не говорил что нужно доводить все до абсурда и пихать проверки куда не нужно.
0
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
10.07.2015, 17:36 #56
Avazart, вернемся к теме.

Чел написал всем известную книгу:
http://www.amazon.com/Large-Scale-So.../dp/0201633620
http://stackoverflow.com/questions/1...oftware-design

Его слова с аннотации к выступлению на CppCon14 (выделения мои):
In our component-based development methodology, each developer is responsible for ensuring that the software he or she creates is easy to understand and use, and not especially easy to misuse. One common form of misuse is to invoke a library function or method under circumstances where not all of its preconditions are satisfied, leading to undefined behavior. Contracts having undefined behavior are not necessarily undesirable, and (for many engineering reasons) are often optimal. Most would agree that a well-implemented library should do something other than silently continue when a pre-condition violation is detected, although these same folks might not agree on what specific action should be taken. Unfortunately, validating preconditions implies writing additional code that will execute at runtime. More code runs slower, and some would fairly argue that they should not be forced to pay for redundant runtime checks in the library software they use. Whether and to what extent library functions should validate their preconditions, and what should happen if a precondition violation is detected are questions that are best answered on an application by application basis - i.e., by the owner of main.
Ты с ним не согласен?
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
11.07.2015, 01:59 #57
Вопрос в том что ставить во главе безопасность или скорость, как по мне в большинстве случаем ставится во главе именно безопастность. С другой стороны спецификой именно С++ также являестся и эффективность/скорость. В общем баланс никто не отменял.

В любом случае пользователю желательно предоставить безопастную библиоткеку точнее сказать библиотеку с безопасным видом/интерфейсом, в нутри которая конечно может содержать самые разные оптимизации от си кода до асм вставок.

То что допустим STL не делает какие либо проверки и больший перевес в сторону скорости, так это "основопологающая" либа собственно которой отдельное место стандарте и посвещена не одна книга.

Т.е готовы ли вы писать талмуды и "учить" людей как правильно использовать вашу библиотеку, вводить свои термины и понятия специфические для вашей либы? Нужна ли вам настолько производительность?

Добавлено через 9 минут

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
Может с итераторов начнешь? А то класс итератора при разыменовании не проверяет, конечный он или нет. Там UB получается. Ну так как?
Кстати все же для этого есть алтернативный интерфейс через индексы и метод .at().



Добавлено через 16 минут
Цитата Сообщение от ct0r Посмотреть сообщение
Avazart, вернемся к теме.
Что касается изначальной темы и авторов книг:

41. Делайте данные-члены закрытыми (кроме случая агрегатов в стиле структур С)

Резюме
Данные-члены должны быть закрыты. Только в случае простейших типов в стиле структур языка С, объединяющих в единое целое набор значений, не претендующих на инкапсуляцию и не обеспечивающих поведение, делайте все данные-члены открытыми. Избегайте смешивания открытых и закрытых данных, что практически всегда говорит о бестолковом дизайне.
Защищенные данные обладают всеми недостатками открытых данных, поскольку наличие защищенных данных означает, что абстракция разделяет ответственность за поддержание одного или нескольких инвариантов с неограниченным множеством кода — теперь это код существующих и будущих производных классов. Более того, любой код может читать и модифицировать защищенные данные так же легко, как и открытые — просто создав производный класс и используя его для доступа к данным.
Герб Саттер, Андрей Александреску "Стандарты программирования на С++ 101 правило и рекомендация "

http://bookscafe.net/read/satter_ger...TOC_idp1948512
0
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
11.07.2015, 02:52 #58
Цитата Сообщение от Avazart Посмотреть сообщение
В любом случае пользователю желательно предоставить безопастную библиоткеку точнее сказать библиотеку с безопасным видом/интерфейсом, в нутри которая конечно может содержать самые разные оптимизации от си кода до асм вставок.
Желательно кому? А если пользователю ну очень важна скорость? Еще при проектировании либы разработчики примерно определяют, какой процент времени CPU целесообразно потратить на проверку предусловий.

Цитата Сообщение от Avazart Посмотреть сообщение
Т.е готовы ли вы писать талмуды и "учить" людей как правильно использовать вашу библиотеку, вводить свои термины и понятия специфические для вашей либы? Нужна ли вам настолько производительность?
Ну а если нужна? Да и какие талмуды? Что именно должно документироваться, написано в вики https://en.wikipedia.org/wiki/Design_by_contract

Цитата Сообщение от Avazart Посмотреть сообщение
Кстати все же для этого есть алтернативный интерфейс через индексы и метод .at().
Это только у вектора.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
11.07.2015, 03:00 #59
Цитата Сообщение от ct0r Посмотреть сообщение
Желательно кому? А если пользователю ну очень важна скорость? Еще при проектировании либы разработчики примерно определяют, какой процент времени CPU целесообразно потратить на проверку предусловий.
Двойной интерфейс (безопасный/небезопасный), оптимизация "внутри".

Цитата Сообщение от ct0r Посмотреть сообщение
Да и какие талмуды? Что именно должно документироваться,
Все что нестандартное, все что может вызвать ошибку итп, что бы пользователь не гадал и не лез в исходники что бы понять в чем и где ошибка.
Разве всякие ассерты не являются проверками?

Цитата Сообщение от ct0r Посмотреть сообщение
Это только у вектора.
Так на кой листу произвольный доступ. Если же итерируешь то самой сабой подразумевается проверка и валидность.
Как в принципе и работа с массивами через указатели.
0
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
11.07.2015, 03:12 #60
Цитата Сообщение от Avazart Посмотреть сообщение
Двойной интерфейс (безопасный/небезопасный), оптимизация "внутри".
Двойной интерфейс как вариант. По сути это и есть готовая обертка - вызовы внутри будут делегироваться к коду без проверок.

Цитата Сообщение от Avazart Посмотреть сообщение
Все что нестандартное, все что может вызвать ошибку итп, что бы пользователь не гадал и не лез в исходники что бы понять в чем и где ошибка.
В случае без проверок мы документируем, как правильно надо пользоваться, остальное - UB. В случае с проверками нам помимо этого нужно расписать, как либа сообщает об ошибках (исключения, коды ошибок, запись в лог, какие-нибудь Maybe монады) и какие именно ошибки в каком случае возвращаются. Кажется, что во втором варианте писать больше, разве нет?

Цитата Сообщение от Avazart Посмотреть сообщение
Так на кой листу произвольный доступ. Если же итерируешь то самой сабой подразумевается проверка и валидность.
Как в принципе и работа с массивами через указатели.
Ну просто итераторы - это такая фигня, которая используется алгоритмами для того, чтобы по максимуму абстрагироваться от типа контейнера. Или я не понял, что ты имел в виду.
0
11.07.2015, 03:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2015, 03:12
Привет! Вот еще темы с ответами:

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит! - C++
Друзья! Вот код #include &lt;stdio.h&gt; template &lt;class T&gt; class otets { protected: int peremennaya; }; template &lt;class...

Свой класс в С++ - C++
Пытаюсь сделать класс массива точнее переписать код из учебника, но так как код приводится не целый а кусками то что в данный момент...

Создать свой класс - C++
сижу книжку читаю (уже пару недель), там по чуть-чуть все время про классы (в каждой главе) рассказывают, а как полностью сконструировать...

Строки свой класс - C++
Вобщем в чем проблема, нужно реализовать строковый класс начальная структура такова Str.h #include &lt;iostream&gt; class MyString ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.