быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
|||||||||||
1 | |||||||||||
Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?05.07.2011, 22:45. Показов 7220. Ответов 42
Метки нет Все метки)
(
На самом деле ничё фантастического я не прошу, ведь:
0
|
05.07.2011, 22:45 | |
05.07.2011, 22:45 | |
Ответы с готовыми решениями:
42
Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? Как правильно передавать параметры из класса А в класс С через класс B? Класс: как обратиться к методу производного класса через итератор на базовый класс? |
Заблокирован
|
|
05.07.2011, 23:02 | 2 |
Теоретически, родитель может научить своего ребёнка знанию о том, где он, родитель, живёт.
Соотвественно, ребёнок сможет получить доступ к интерфейсу родителя, а если они друзья - и ко всем его данным-членам. Сделать можно... но... Но в вашем случае это же совершенно не нужно, это пример чудовищной архитектуры. Почему вы постоянно норовите все сделать шиворот-навыворот? Вы осознаете к каким последствием может привести подобная методика кодирования? Это мина замедленного действия, вы один паршивый класс реализовать не можете. А что говорить о системе из классов? Стоит на каком то этапе проекта чуть чуть изменить задачу, и весь ваш код можно будит выбросить в мусорное ведро. Подобная методика написания классов - нарушение всех базовых принципов ООП, главный из которых - инкапсуляуия данных. /зы необходимость задействовать френдов - хороший повод ещё раз проанализировать архитектуру. /ззы указатель this спасёт отца русской демократии.
0
|
быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
||||||
05.07.2011, 23:11 [ТС] | 3 | |||||
Я ба рад не использовать friend, но: класс B должен получить доступ к полям класса A. Всё. (Да, и если бы можно было сделать класс B производным от A, я бы сделал. Но нельзя- это между прочим.)
А Вашему умению компилить в уме я завидую, но иногда оно даёт сбой.
Добавлено через 1 минуту И это... Родитель- ребёнок, я такую терминологию использую обычно если говорю об именно производных и родительских классх. Тут же ими и нге пахнет. Извините.
0
|
быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
|
05.07.2011, 23:24 [ТС] | 5 |
Обратимся к вещам, нежели обращаться к их названиям, вот:
0
|
Заблокирован
|
|
05.07.2011, 23:27 | 6 |
Есть правила, ставшие уже классическими для ООП. Описываются практически в любой книге (рекомендую Макконелла. Он здорово мазги прочищает).
Два из них гласят: 1. Все данные-члены класса должны быть закрыты ДЛЯ ВСЕХ других классов. Только класс- владелец имеет право прямого доступа к своим данным-членам. Если отойти от этого правила, это может привести к проблемам. (что за проблемы, и с чем связанно хорошо объясняет Макконелл) 2. Программируйте в терминах интерфейса класса. Это значит, что все действия над объектом класса производятся исключительно через интерфейс класса. Так, только так, и никак иначе. А теперь объясните мне, на кой чорт ребёнку иметь прямой доступ к данным-членам родителя? Почему ребёнок не может обратится к родителю через его интерфейс???? Замечание про компиляцию не вразумел. Это уже из области терминологии. Лично я называю систему-полиморф "семейством", а её членов так и называю "члены семейства". Ну или "родственники одного семейства". Производный класс при прямом наследовании - собственно наследником, или потомком Базовый класс - предок. (при этом предки и потомки тоже являются родственниками, но я никогда не называю их членами одного семейства, что бы не пустать с полиморфной системой). Порожденная сущность - ребёнок, порождающая сущность - родитель.
0
|
быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
|||||||||||
05.07.2011, 23:44 [ТС] | 7 | ||||||||||
Весело с вами
Впрочем, даже если бы последнее и сработало, вопрос- почему прямой доступ на сработал? остался бы открытым. Дружественный класс есть дружественный класс, знаете ли.
0
|
Заблокирован
|
||||||
05.07.2011, 23:57 | 8 | |||||
я рекомендую вам в корне изменить подход к проектированию.
Вот лично я это делаю так: 0. Определение предназначения класса. Важно четко понимать, на кой черт он вообще нужен. 1. Продумываю дизайн кода. То бишь, как я вижу использование будущего класса. Например:
Какие вспомогательные классы он будит использовать, и тп. Предположим, я пришёл к мнению, что мой класс CMatrix должен использовать вспомогательный класс CDiagonal. Ну вот так мне захотелось! Что из этого следует? Из этого следует, что класс CMatrix уже должен знать о существовании класса CDiagonal. То бишь, CDiagonal уже должен быть спроектирован и создан, причём - отдельно от CMatrix. CDiagonal ничего не знает ни о каких матрицах, и знание это ему для его собственной работы не нужно! Это называется "разделение ответственности между классами" Таким образом получается, что сначала проектируется и собирается класс CDiagonal. И только потом собирается класс матрицы. Внутри неё объявляется класс диагонали с красивым именем, ну и матрица может использовать интерфейс диагонали. Но не наоборот. Диагональ оказывается глубоко запрятанной в матрице, а пользователю матрицы в принципе даже знать не обязательно о том, что прячеццо в недрах Матрицы. /зы бывают специфические ситуации, когда ребёнку нужно знать о существовании родителя, но это уже совсем отдельный разговор, опять таки, для таких ситуаций есть свои красивые решения. Это не ваш случай.
0
|
быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
||||||||||||||||
06.07.2011, 00:33 [ТС] | 9 | |||||||||||||||
Это я всё знаю, Да, знаю. Просто мне необходимо было сделать класс diagonal не отдельно от matrix, а встроенным в него. И поскольку я чувствую недоверие к собственным решениям, придётся объяснить и это, мне это надо было чтобы программировать так:
То есть тут сперва одна перегрузка [] срабатывает, потом другая [], в результате последней должна вызваться функция: f_perevod_kkoordinat(koordinati* koordinati_, 2, 3) (обратите внимание на аргументы) Так, эта функция исходя из диагональных координат 2, 3 (вторая диагональ, третий элемент) заполнит структурку
Проще можно сделать так,такой интерфейс 1)[CPP]m.diagonal_ (2, 3)= 99;/CPP] угу? Но мне охота по другому. Классический синтаксис чтобы был! 2)Или можно было скропать массив диагоналей, а потом перегрузить оператор [], получив адрес вектора, а потом взять его элемент. И это бы я сделал. Но я массив диагоналей кропать не хочу, а хочу использьвать изящную формулку (я её уже наваял) перевода диагональных координат в стандартные матричные. И вообще тяжело в ученье легко в бою, упражнения должны быть трудны, иначе грош им цена. Ну и конечно, реалистичны, но о последнем я судит не могу, ибо их сам придумываю, а потом разбираюсь, а реализуемы ли они вообще ли нет. Добавлено через 6 минут Кстати, я с самого начала исхожу из интерфейса, наверное, это неправильно? Добавлено через 1 минуту Ну то есть вы исходите из функциональности класса, я в принципе тоже но ещё исхожу и чтобы был простой интерфейс, вот и парюсь.
0
|
Заблокирован
|
|
06.07.2011, 00:49 | 10 |
Я понимаю слово "интерфейс", как "способ управления".
И я всегда прежде всего думаю об интерфейсе. Мне очень критично, что бы пользоваться классом было легко, удобно). Единственное, когда я размышляю об интерфейсе управления некой сущности, я называю её не "классом", а "инструментом". Потому что я такой подход использую не только при разработке одного класса, но и целой системы (библиотеки/ етс) И уже определившись с дизайном интерфейса, я под него придумываю собственно реализацию. Смысл прост - нужно что бы наружу торчал только интерфейс, а все остальное - упрятано внутри. Инкапсуляция, понимаешь... )
0
|
быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
|
06.07.2011, 00:51 [ТС] | 11 |
Вот я так и делаю. В общем, моя задача из разряда нерешаемых. Жаль, очень жаль.
0
|
Заблокирован
|
|
06.07.2011, 01:00 | 12 |
Тут понимаете в чем деликатность то... внешне смотрится, как многомерный массив. А на самом деле он им является, или нет? Это может сбить с толку. А все, что сбивает с толку - источник ошибок. Лично я вообще избегаю многомерных массивов. Интерфейс должен быть очивиден. Интуитивно понятен. И ещё один момент: запись типа Array[x][y] можно понять, как: Array[столбец][строка], а можно и наоборот: Array[строка][столбец] Даже если знаешь точно - перепутать ничайно очень просто. Это.... не читабельно. Добавлено через 2 минуты В с++ все решаемо. Не решаемо окажется позже, когда вы захотите добавить ешё какую нить фичу в класс матрицы)) Научить ребёнка знать, где живёт его родитель можно - например, с помощью указателя this
0
|
быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
||||||
06.07.2011, 01:12 [ТС] | 13 | |||||
Вы меня удивляете. Давайте всё же условимся, что Array[x][y] это Array[строка][столбец], всё остальное от лукавого. По крайней мере, если чел, пользующийся моим классом или я сам перепутает строку со столбцом, значит тут я ничё поделать не смогу.
Опять же Array[x][y] Это такой массив векторов: int int int int int int int int int диагонали то есть. Да это не двумерный массив.(куцый какой-то) Но не всё ли равно, что он на самом деле? Важно, чтобы можно было просто обратиться к какому-нибудь его элементу простым способом. (Может, я много на себя беру, но для меня такой способ m.diagonal_ [2][3]= 99 и есть интуитивно понятный) Инкапсуляция, знает ли... Но это лирика всё. .................................... А на счёт this я так и не понял, вот же:
0
|
Заблокирован
|
|
06.07.2011, 01:29 | 14 |
тогда, если исходить из дизайна интерфейса, почему бы не сделать вот так:
CMatrix myMatrix(строк, столбцов); //вот так мы создаём объект Value = myMatrix [x][y]; //вот так мы получаем доступ к элементу myMatrix[x][y] = Value; //а вот так элементу матрицы присваивается значение.
0
|
быдлокодер
![]() 1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,691
|
||||||
06.07.2011, 01:46 [ТС] | 15 | |||||
С этим проблем нет, всё работает кроме указаннного
0
|
![]() 187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|||||||||||
06.07.2011, 06:42 | 17 | ||||||||||
можно сделать так
как вариант также можно сделать функцию статической
Добавлено через 4 минуты есть вложенный класс который является другом объемлюющего и всё это должно компилиться. вот наиболее важная мысля
0
|
Заблокирован
|
|
06.07.2011, 11:18 | 18 |
У статических функций и данных внутри класса есть свои специфические задачи.
Если предполагается, что доступ к интерфейсу класса должен осуществляться только через интерфейс объекта класса, то статик-функции не нужны. Если предполагается, что все данные-члены класса должны быть уникальны для каждого объекта класса, то статик-данные не нужны.
0
|
![]() 187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
06.07.2011, 11:41 | 19 |
наследование удовлетворяет требованиям из поста #13
0
|
Заблокирован
|
|
06.07.2011, 11:57 | 20 |
Да это разве требования... так набросок предварительный.
От задачи плясать нужно. А к чему вы наследование упомянули? Добавлено через 4 минуты краеугольным камнем во всей этой истории является вот такая конструктива: y.diagonal[2][1]; // не понятно что происходит в этой строчке. Если это действительно то, что я думаю (деталь интерфейса), то становится ясно, что задумал автор, и как это реализовать. Если это то, что я думаю, то тут не нужны ни статики, ни наследование. Подождём автора)
0
|
06.07.2011, 11:57 | |
06.07.2011, 11:57 | |
Помогаю со студенческими работами здесь
20
Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами Класс: Описать класс Points, затем производный от него Circle Класс: Разработать абстрактный класс класс Point для задания координаты...
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
![]() |
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Система безопасности в Laravel: возможности и примеры
Wired 18.02.2025
Каждый день появляются новые виды атак и уязвимостей, которые могут поставить под угрозу конфиденциальные данные пользователей и функционирование всей системы. В этом контексте выбор надежного. . .
|
Давайте сравним Django и Laravel
Wired 18.02.2025
Django и Laravel - два мощных инструмента, которые часто сравнивают между собой. Оба фреймворка предлагают разработчикам богатый набор возможностей для создания масштабируемых веб-приложений, но. . .
|
Laravel или React - что лучше?
Wired 18.02.2025
В разработке веб выбор правильного инструмента часто определяет успех всего проекта. Особенно интересным представляется сравнение Laravel и React - двух популярных технологий, которые часто. . .
|
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
|
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
|
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
|
Laravel или Symfony: что лучше для старта?
Wired 18.02.2025
В веб-разработке выбор правильного фреймворка может стать определяющим фактором успеха проекта. Особенно это актуально для PHP - одного из самых распространенных языков программирования, где Laravel. . .
|
Что нового в Laravel 12
Wired 18.02.2025
С момента своего появления в 2011 году Laravel постоянно развивается, внедряя инновационные решения и совершенствуя существующие возможности. В начале 2025 года ожидается выход Laravel 12 - новой. . .
|
Роутер в Laravel: как работать с маршрутами
Wired 18.02.2025
Маршрутизация - один из основополагающих элементов любого веб-приложения на Laravel, определяющий как приложение отвечает на HTTP-запросы к различным URL-адресам. По сути, роутинг - это механизм. . .
|
Интеграция шаблона Bootstrap в Laravel PHP
Wired 18.02.2025
Разработка веб-приложений в современном мире требует не только надежного бэкенда, но и привлекательного, отзывчивого интерфейса. Laravel, как один из самых популярных PHP-фреймворков, отлично. . .
|