|
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
|
||||||||||||||||
Как обратится к обьекту класса, являющегося наследником абстрактного класса31.07.2015, 23:58. Показов 10198. Ответов 131
Метки нет (Все метки)
Здравствуйте!
У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на виртуальный класс (динамический массив, который растет от методов buildCar и buildTruck). eFuel - это также класс, который содержит еще класс, но в данном вопросе они не принимают участия. Вопрос: как через указатель четвертого класса доступится к наследующим классам?
0
|
||||||||||||||||
| 31.07.2015, 23:58 | |
|
Ответы с готовыми решениями:
131
Как полю класса А обратится к приватной функции класса А?
|
|
|
||
| 01.08.2015, 14:24 | ||
|
friend в действительности мог бы предлагать больше, и точнее давать возможность задавать более жесткие правила доступа. Выше я приводил пример с friend, мне нужен был доступ только к закрытым конструкторам классов, вместо этого я получал доступ ко всем закрытым членам.
0
|
||
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||
| 01.08.2015, 14:36 | ||
|
0
|
||
|
|
|||
| 01.08.2015, 14:37 | |||
|
Что это как не нарушение инкапсуляции когда предоставляется больше прав чем нужно/предполагается?
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 01.08.2015, 14:37 | ||
|
Например для начала, можно было бы не давать доступ к данным класса всему ChainOfGasStation, а только методу, занимающемуся созданием экземпляра. Т.е. этот метод заменяет собой конструктор + устанавливает отношения взаимодействия и контракт, мы подчеркиваем, что только ChainOfGasStation::addCarGasStation может создать экземпляр. В этом случае не будет нарушения. Т.к. настоящий конструктор тоже имеет доступ ко всем данным - это равноценный обмен. Уже был аналогичный вопрос, я постарался расписать все подробно (со ссылками на источники, чтобы не быть голословным): https://www.cyberforum.ru/post7804066.html
1
|
||
|
|
|||
| 01.08.2015, 14:42 | |||
|
Добавлено через 2 минуты Но это никак не меняет сути проблемы из того метода нам по прежнему доступны все внутренности, когда нужен только конструктор.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 01.08.2015, 14:56 | ||
|
и не нужно её создавать: не нужно пытаться сделать убер-защиту класса от злобных хаккеров, которые будут искать уязвимости в его защите. это - зряшная трата времени и сил. задача - уберечься лишь от ничайных ошибок.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 01.08.2015, 14:57 | ||||
|
Поэтому Cтрауструп пишет о том, что человек, который пишет про однозначное нарушение инкапсуляции через friend - просто не до конца понимает терминологию С++. Но если хочется еще больше, то можно разбить наш класс на собственно создающую часть и часть с данными\логикой. Сделать другом только создающую часть, т.к. friend не распространяется на наследование. Техническая возможность ограничить еще больше, существует.
0
|
||||
|
|
||||
| 01.08.2015, 15:08 | ||||
|
В данном случае friend как продавец в супермаркете вы покупаете товар, а в место сдачи продавец вам дает жвачку и еще какую фигню которая вам не нада совсем.
А человек который читает код должен прилогать большие усилия что бы понять для чего именно тут открыли все потроха... Если немного пофантазировать то можно было бы придумать что-то вроде:
Остался бы вопрос к целесообразности этого в плане реализации.
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 01.08.2015, 15:13 | |||||
|
трех простых модификаторов доступа хватает за глаза. в том числе для установления более жестких контрактов в случае необходимости, или параноидальности разработчика. я выделил друга - функцию make. функция make не занимается ничем, кроме создания. ну и какие здесь проблемы с логикой? для того, что бы пользоваться. все остальное - инкапсуляция. хотя конечно, увидев, что конструкторы закрыты, не нужно иметь семи пядей во лбу, что бы без всякой документации понять, что делает функция с именем make, и зачем ей дружеские полномочия. синтаксис полюсов итак считается перегруженным. нет причин, грузить его ещё больше вещами, которые никаких реальных проблем не решают.
0
|
|||||
|
|
|||
| 01.08.2015, 15:17 | |||
|
Как по мне значительная часть новшеств С++11 ничего не решает. Добавлено через 1 минуту Потом лезит в этот класс-друг и там смотрит и чешит репу.... И так может метаться кобанчиком от одного к другому несколько раз.
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||||||
| 01.08.2015, 15:18 | ||||||||||||
Теперь делаем так:
0
|
||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 01.08.2015, 15:21 | ||
|
вы вообще осознаете, что по сути то, что вы предлагаете, это равносильно тому, что бы отдельным частям класса ограничить доступ к другим частям этого же класса?
0
|
||
|
|
||||
| 01.08.2015, 15:26 | ||||
|
Добавлено через 47 секунд Да именно к этому я виду:
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
| 01.08.2015, 15:27 | |||||||||||
Добавлено через 1 минуту
0
|
|||||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 01.08.2015, 15:33 | ||
|
Демонстрирует то, зачем вообще нужен friend. Это альтернативный способ организации интерфейса. Когда мы пишем метод в классе, то почему у нас не возникает желания оставить ему в пользование только часть данных? Сказать: метод x класса А имеет право доступа только к данным а и b класса А, но к данным c и d - не имеет. Пример демонстрирует, что для friend правила такие же как для членов класса. Точно так же как не существует подобного ограничения для членов класса, не существует его и для friend.
0
|
||
|
|
||||||
| 01.08.2015, 15:33 | ||||||
Я не узнаю пока не полезу в hardcore() где увижу что в hardcore() где возможно вызываются закрытые методы и мне опять нужно будет вернуться к классу sample
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 01.08.2015, 15:35 | |||||||
0
|
|||||||
|
|
||
| 01.08.2015, 15:44 | ||
|
hardcore() вполне может быть вменяемым названием, но ее имя не скажет точно с чем из защиенных внутренностей данного класса она работает, для этого мне придется листать код к её определению. Т.е менее информативно.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 01.08.2015, 15:56 | |||
|
пользователя не касается, что там под капотом чужого класса. 2. разработчик знает, что под капотом его собственного класса. 3. если функция называется "создавалка", но на деле - "прибивалка", то у такого кода проблемы посерьезнее, нежели "отсутствие инкапсуляции от себя самого". Добавлено через 3 минуты hardcore в сферическом ваккуме мне ни о чем не говорит, например. имя не должно никак светить подробности реализации.
0
|
|||
| 01.08.2015, 15:56 | |
|
Метод абстрактного класса не видит переменные дочернего класса
Как инициализировать члены класса, являющегося параметром шаблона Как обратится к объекту класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|