Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
 Аватар для Nishen
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,831

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

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

Студворк — интернет-сервис помощи студентам
Всем привет!
Из книги Р. Лафоре относительно спецификатора доступа protected:
Таким образом, если вы пишете класс, который впоследствии будет использоваться как базовый класс при наследовании, то данные, к которым нужно будет иметь доступ, следует объявлять как protected.
Далее пишется следующее:
Существуют и недостатки использования спецификатора доступа protected... это делает члены, объявленные как protected, значительно менее защищенными, чем объявленные как private.
Возникает вопросы: так когда же стоит использовать protected? Как я могу знать, захочет ли кто-нибудь использовать мой класс, как базовый? И как не доиграться со спецификаторами доступа? Как быть, если я хочу использовать чужой класс, но поля класса закрыты спецификатором private?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2015, 18:43
Ответы с готовыми решениями:

Ошибка доступа access violation: почему класс-наследник не видит protected данные-члены класса-родителя?
Подскажите есть базовый класс в разделе protected разместил переменную, которая по идее должна быть видна всем наследникам. Но при запуске...

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

Пишем свой OPC-server
Добрый день! У меня проблема с заданием в университете. Попросили разобраться с OPC-server. Я не очень силен в этой теме, так что...

61
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.07.2015, 00:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от xEmpire Посмотреть сообщение
суперкласса
Цитата Сообщение от hoggy Посмотреть сообщение
суперкласса
В С++ нету таких словей.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
10.07.2015, 03:13
Цитата Сообщение от hoggy Посмотреть сообщение
суть инкапсуляции:
возможность использовать функционал без необходимости знать детали внутренней реализации.
(нам не нужно знать какие есть данные-члены у суперкласса, что бы дергать его методы)
Забавно, что часто приходится узнавать детали внутренней реализации и при инкапсуляции в коде. Отголоски закона дырявых абстракций.

Цитата Сообщение от hoggy Посмотреть сообщение
суть инварианта:
компонент гарантирует стабильность своей работы (отсутствие крашей, утечек ресурсов и тп),
независимо от корректности вызывающей стороны.
Что такое инвариант - всем понятно. А вот что обозначает словосочетание "суть инварианта" - мне неведомо. Тем более что компонент не обязан гарантировать сохранение своих инвариантов всегда. Соблюдение инвариантов вполне может зависеть от каких-то внешних условий.

Цитата Сообщение от hoggy Посмотреть сообщение
то есть, даже если вызывающая сторона запускает функцию с плохими аргументами,
инвариантный компонент это пофиксит, и обработает ошибку.
и никаких сбоев в его работе не будет.
Далеко не всегда так названный "инвариантный компонент" - это хорошо. Все зависит от ситуации. Иногда очень удобно и полезно забить на инварианты и сделать DbC (Design by Contract), подразумевая, что невыполнение предусловий ведет к неопределенному поведению. Это предотвращает маскировку багов и делает код более быстрым. Иногда наоборот, стоит последовать принципам DP (Defensive Programming) и повтыкать ассерты и рантайм-проверки там, где ожидается неправильное использование функционала. Не стоит думать за всех и во всех ситуациях стараться сохранить инварианты любой ценой.

Цитата Сообщение от hoggy Посмотреть сообщение
но если бы данные-члены были открытыми,
тогда любой желающий мог бы залезть,
и как то их подкрутить.
и такой компонент вам уже ничего гарантировать не сможет.
Все эти формальные слова private, protected, public и налагаемые ими ограничения - фигня. По сути их можно читать как просто документацию от проектировщика класса. Очень часто, чтобы не чесать правое ухо левой пяткой, при модульном тестировании нужные private-члены делаются public-членами с соответствующим комментарием, что, мол, это только для тестовых целей.

Цитата Сообщение от hoggy Посмотреть сообщение
архитектура, которая состоит из компонентов,
которые никому ничего не гарантирует - подвережна многочисленным ошибкам.
плохо расширяется. хрупкая (плохо переносит изменения), и тп.
Ну "никому ничего" - это уже преувеличение. Компоненты всегда будут что-то гарантировать при выполнении определенных предусловий.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2015, 06:15
Цитата Сообщение от ct0r Посмотреть сообщение
Отголоски закона дырявых абстракций.
что это за закон такой?

Цитата Сообщение от ct0r Посмотреть сообщение
Что такое инвариант - всем понятно. А вот что обозначает словосочетание "суть инварианта" - мне неведомо.
суть понятия.

Цитата Сообщение от ct0r Посмотреть сообщение
Далеко не всегда так названный "инвариантный компонент" - это хорошо. Все зависит от ситуации.
всегда хорошо, когда он есть.
но не всегда бывает оправданно затрачивать время на его обеспечение.
на практике, обычно, достаточно оградиться от случайных ошибок.

Цитата Сообщение от ct0r Посмотреть сообщение
невыполнение предусловий ведет к неопределенному поведению.
порочная практика.

я могу понять, что для иллюстрации каких то моментов,
хочется наоборот удалить всю обработку ошибок,
что бы не загромождать пример-иллюстрацию.

я могу понять, что при разработке прототипа,
ради скорости можно принебречь качеством

но на бою такого быть не должно.

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

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

Цитата Сообщение от ct0r Посмотреть сообщение
Очень часто, чтобы не чесать правое ухо левой пяткой, при модульном тестировании нужные private-члены делаются public-членами с соответствующим комментарием, что, мол, это только для тестовых целей.
существует несколько техник на этот случай:

1.
уродливые имена функций, которые завершаются подчеркиванием.
(действует прицип привентивной защиты:
сделайте так, что бы использовать механизм неправильно было неудобно)

2.
препроцессор.
дефайн-паблик-морозов.


хотя лично я думаю,
что если у программиста есть такие проблемы,
значит он просто не умеет TDD.

если бы он сначала написал тест
(а значит, подумал, как он это все тестировать будет),
и только потом - реализацию тестируемого компонента,
то таких проблем у него изначально бы не возникло.

Цитата Сообщение от ct0r Посмотреть сообщение
Ну "никому ничего" - это уже преувеличение. Компоненты всегда будут что-то гарантировать при выполнении определенных предусловий.
видно вы действительно так и не поняли сути инварианта.

вдумайтесь в эту фразу:
способность гарантировать стабильность своей работы не зависимо от корректности вызывающей стороны.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
10.07.2015, 07:18
Цитата Сообщение от ct0r Посмотреть сообщение
Очень часто, чтобы не чесать правое ухо левой пяткой, при модульном тестировании нужные private-члены делаются public-членами с соответствующим комментарием, что, мол, это только для тестовых целей.
А разгадка проста - в этом классе нарушен single responsibility principle и/или не используется dependency injection.
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.07.2015, 09:29
Еще одна глупость этого Лафоре.
Хотелось бы Вашу книжку прочесть
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.07.2015, 09:51
Цитата Сообщение от egor2116 Посмотреть сообщение
Хотелось бы Вашу книжку прочесть
Т.е. все, кто еще не написал книжки, должны восторгаться придурком Лафоре?
Чтобы судить о вкусе омлета не обязательно уметь нести яйца.
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.07.2015, 09:56
Т.е. все, кто еще не написал книжки, должны восторгаться придурком Лафоре?
Да я не предлагаю ни кем восторгаться. Вы просто очень категоричны. Вы пишите программы без ошибок и все ими восторгаются, и не у кого нет мнения что какую нибудь часть можно было реализовать по другому не так как у Вас?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.07.2015, 10:12
Цитата Сообщение от egor2116 Посмотреть сообщение
Вы просто очень категоричны.
Да ладно! Лафоре полнейший невежда в той области, в которой он собрался учить других. Только от тех ляпов, что здесь на форуме процитированы, у нормального человека уши вянут, а ведь некоторые люди еще и специально засир@ют себе мозги, читая его дерьмокнижки.
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.07.2015, 10:16
"Лафоре полнейший невежда в той области." "Только от тех ляпов"
Возможно, но нужно не забывать что данная литература является переводом и тут нужно обратить так же внимание на переводчика т.к. литература техническая и насыщена соответствующей терминологией, а также
у нормального человека уши вянут
человек который интересуется данной тематикой профессионально должен прочитать далеко не одного автора и не один раз.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.07.2015, 10:22
Цитата Сообщение от egor2116 Посмотреть сообщение
человек который интересуется данной тематикой профессионально должен прочитать далеко не одного автора и не один раз.
Однако это не причина читать придурков. Литературы самого высокого качества столько, что жизни не хватит, чтобы ее прочесть.
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.07.2015, 10:34
Однако это не причина читать придурков.
Однако Вы должны согласится, что начинающему изучать данный ЯП, тяжело понять какой автор хорош, а какого не следует читать, пока начинающий не прочитает и не сравнит и не попробует на практике или не спросит совета форуме.
Я думаю все или большинство должны наступить и/или наступают на грабли, что бы понять что есть хорошо и правильно и почему именно так, а чего делать не стоит и почему, и к чему это может привести в дальнейшем.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.07.2015, 11:28
Цитата Сообщение от egor2116 Посмотреть сообщение
начинающему изучать данный ЯП, тяжело понять какой автор хорош
Умный человек или косящий под умного спросит и послушает умных и знающих, ну а некоторым, как известно, закон не писан.
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.07.2015, 11:32
спросит и послушает
умных и знающих или косящих под умных и знающих, но навряд ли поймет, почему нужно делать именно так, а не как то по другому, это он сможет понять только с опытом.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
10.07.2015, 11:44
Цитата Сообщение от hoggy Посмотреть сообщение
что это за закон такой?
То есть вы даже Джоэла Сполски не читали? А гуглить умеете? Первая ссылка в поиске.

Цитата Сообщение от hoggy Посмотреть сообщение
порочная практика.
В некоторых случаях так уже давно все делают. В прошлом году даже доклад на cppcon был на эту тему. Порочная практика - это фиксить изнутри вызывающую сторону, маскируя ее баги.

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

Цитата Сообщение от hoggy Посмотреть сообщение
ассерт проверки в релизе не кушают.
зато код читабельный,
и спать можно спокойно.
Во-первых, против ассертов я ничего не имею. Во-вторых, ассерты не абсолютная защита, поэтому спать спокойно рано.

Цитата Сообщение от hoggy Посмотреть сообщение
уродливые имена функций, которые завершаются подчеркиванием.
(действует прицип привентивной защиты:
сделайте так, что бы использовать механизм неправильно было неудобно)
Этак я и тестирование сделаю неудобным. А кто захочет - подчеркивание все равно не проблема дописать.

Цитата Сообщение от hoggy Посмотреть сообщение
препроцессор.
дефайн-паблик-морозов.
Эээ, нет, благодарю

Цитата Сообщение от hoggy Посмотреть сообщение
хотя лично я думаю,
что если у программиста есть такие проблемы,
значит он просто не умеет TDD.
если бы он сначала написал тест
(а значит, подумал, как он это все тестировать будет),
и только потом - реализацию тестируемого компонента,
то таких проблем у него изначально бы не возникло.
А что, нынче TDD это типа панацея? Да и вы наверное на игрушечных примерах использовали TDD, потому что в реальном мире не все так радужно и приходится очень часто идти на компромиссы между "так некрасиво" и "так тоже некрасиво".

Цитата Сообщение от hoggy Посмотреть сообщение
видно вы действительно так и не поняли сути инварианта.
вдумайтесь в эту фразу:
В огороде бузина, а в Киеве дядька? Ваш ответ на мою цитату ассоциируется с ней чуть меньше, чем никак.

Цитата Сообщение от Voivoid Посмотреть сообщение
А разгадка проста - в этом классе нарушен single responsibility principle и/или не используется dependency injection.
Если в классе есть куча сильно связанных между собой данных, которые должны находиться в определенном согласованном состоянии, то что тогда? Еще не стоит забывать про тот факт, что хоть SRP и DI это хорошо, но слепое следование им может породить кучу мелких сущностей, которые в принципе не так уж и нужны, а только раздувают код, уменьшая понятность и читабельность.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
10.07.2015, 11:52
Цитата Сообщение от ct0r Посмотреть сообщение
Если в классе есть куча сильно связанных между собой данных, которые должны находиться в определенном согласованном состоянии, то что тогда?
Под такой формулировкой может скрываться все что угодно, надо смотреть код

Цитата Сообщение от ct0r Посмотреть сообщение
а только раздувают код, уменьшая понятность и читабельность.
Только если не получается или же лень давать сущностям адекватные имена
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.07.2015, 12:34
Цитата Сообщение от egor2116 Посмотреть сообщение
Хотелось бы Вашу книжку прочесть
Просто у человека который прочел больше чем одну книжку есть с чем сравнить (например с Маерсом,Саттером,Александреску итд).
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.07.2015, 12:36
Просто у человека который прочел больше чем одну книжку
Об этом так же шел разговор выше, если бы вы его прочитали, а не взяли первое попавшееся сообщение.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.07.2015, 12:41
Цитата Сообщение от ct0r Посмотреть сообщение
Порочная практика - это фиксить изнутри вызывающую сторону, маскируя ее баги.
О чем конкретно речь? Что-то можно фиксить/инорирвать что происходит из ошибок изнутри ибо в контексте этого объекта это не ошибка, а нормальное поведение, а что-то приводит к тому что нужно изменять описание ошибки и пробрасывать выше это все сугубо от задачи.
Но тупо "оставлять как есть" вероятно допустимо только на этапе "сырой/первичной" разработки и то только когда не понятно что есть что.

Добавлено через 1 минуту
Цитата Сообщение от egor2116 Посмотреть сообщение
Об этом так же шел разговор выше, если бы вы его прочитали, а не взяли первое попавшееся сообщение.
Ну так чему вопросы и сомнения о дурке с паблик данными в Лафоре?
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
10.07.2015, 12:47
Ну так чему вопросы
Да в общем то разговор исчерпал себя.
Вообще то как я понял речь шла про protected поля у базового класса и мое общение с Mr.X было связано не с этим, а с автором этого учебника, но как я сказал наш разговор с ним себя исчерпал.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
10.07.2015, 14:44
Цитата Сообщение от Voivoid Посмотреть сообщение
Только если не получается или же лень давать сущностям адекватные имена
Дело не столько в именовании. Больше классов - больше надо держать в памяти (какие-то их особенности, exception safety, etc) - больше файлов - сложнее физическая структура проекта - труднее навигация (особенно в условиях отсутствия возможности использования IDE или на проекте, использующем bjam для сборки). Каждая ситуация по-своему уникальна, и делать SRP и DI догмами не стоит.

Цитата Сообщение от Avazart Посмотреть сообщение
О чем конкретно речь? Что-то можно фиксить/инорирвать что происходит из ошибок изнутри ибо в контексте этого объекта это не ошибка, а нормальное поведение, а что-то приводит к тому что нужно изменять описание ошибки и пробрасывать выше это все сугубо от задачи.
Но тупо "оставлять как есть" вероятно допустимо только на этапе "сырой/первичной" разработки и то только когда не понятно что есть что.
Я не совсем понял, что ты имеешь в виду, но речь вот о чем. Предположим, что у нас есть класс даты. Мы можем. Либо все время проверять дату на валидность и не допускать левых дат. Либо создать контракт использования класса, contract violation оставить ведущим к UB, повтыкать ассертов, наплевать на нарушение инвариантов в релизе. Я считаю, что оба подхода нормальны и имеют право на применение, в зависимости от ситуации. hoggy активно продвигает первый вариант с сохранением инвариантов всегда. Либо он не различает терминологию. Либо выражает свою мысль неясно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2015, 14:44

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

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

Пишем свой первый Windows-драйвер
https://habrahabr.ru/post/40466/ Пытаюсь по уроку собрать и запустить первый драйвер Файл CMDS.bat SET THIS_DIR=%cd% SET...

Пишем свой интерпретатор языка BASIC
Добрый день. Я смотрю, тут на форуме была тема коллективного написания интерпретатора BASIC на языке С++. Я очень извиняюсь, но я...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru