140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
|
||||||||||||||||
1 | ||||||||||||||||
Как обратится к обьекту класса, являющегося наследником абстрактного класса31.07.2015, 23:58. Показов 6946. Ответов 131
Метки нет (Все метки)
Здравствуйте!
У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на виртуальный класс (динамический массив, который растет от методов buildCar и buildTruck). eFuel - это также класс, который содержит еще класс, но в данном вопросе они не принимают участия. Вопрос: как через указатель четвертого класса доступится к наследующим классам?
0
|
31.07.2015, 23:58 | |
Ответы с готовыми решениями:
131
как узнать,является данный объект класса А1 наследником класса А2 Как полю класса А обратится к приватной функции класса А? Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса |
01.08.2015, 16:01 | 81 |
Естественно нет, ибо один класс не лезит в другой...
Да и по сути, что это код делает? К примеру чем тут конструктор не устроил? Добавлено через 3 минуты Ну.. ну... пользователь это разработчик спустя несколько месяцев .... когда все уже подзабылось. Добавлено через 1 минуту Имя нет, о чем я и пытался сказать, а вот "фриенд-объявление" неплохо бы что бы говорило, точнее сказать что давало больше информации об "отношениях" к этому классу.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
01.08.2015, 16:06 | 82 |
ну и что?
если разраб через полгода собственный код вразуметь не в состоянии - ну его трудности. значит такой разраб. "пьяный проспится, дурак - никогда"(ц)Петр 1. и кстати, чем меньше всякой ботвы, тем проще код. когда я читаю чужой код, я смотрю на то, что код делает по факту. а не на то, чего он мог бы сделать, или не мог. Добавлено через 56 секунд если вы считаете, что имя не достаточно понятное - ну дайте более понятное.
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
01.08.2015, 16:22 | 83 |
Это демонстрационный пример. Детали не играют роли, главное там - это строки 9 и 16, которые демонстрируют ноль отличий, с точки зрения доступа к данным класса.
А вообще есть разные варианты применения такого. Когда конструктор спрятан, чтобы кто попало не мог создать объект. Это как раз пример усиления инкапсуляции, путем накладывания дополнительных ограничений. Ты же сам с подобного примера и начал. В любом случае, без конкретной задачи целесообразность подобного обсуждать бессмысленно. В С++ есть много идиом, которые без упоминания конкретной задачи могут показаться бредом. PS. Вообще, если интересно, демонстрационный пример использовал в основе эту идиому: https://en.wikibooks.org/wiki/... onstructor Однако это напрямую не относится к обсуждаемому вопросу.
2
|
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
||||||
01.08.2015, 16:48 | 84 | |||||
Это называется как загнать себя в угол с инкапсуляцией.По идеи пример не имеет право на жизнь. Потому как я не смогу сделать вот так.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
01.08.2015, 17:02 | 85 |
сложно предполагать, что вы понимаете под инкапсуляцией.
но в голове у вас конкретная каша.
0
|
01.08.2015, 17:07 | 86 |
Да как раз дьявал в деталях.
А я о чем... твой код бред .. непонятно что делает, для чего и как. Класс Base пустой.... явно чего то нехватает... Добавлено через 2 минуты Добро пожаловать в Си и Asm там все просто... Добавлено через 48 секунд Ну вот и я про то нужно смотреть, не интуитивно... Добавлено через 45 секунд Так а я о чем нет таких средств в С++.
0
|
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
|
01.08.2015, 17:17 | 87 |
Так же как и вы. Тык или не ?
Ну так приведите контр-пример или типа классы не могут быть скрытыми ? P.S меньше читайте всяких умников - больше пишите кода, иначе только забьете голову всяким бредом так и не научившись кодить
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
01.08.2015, 17:31 | 88 |
мне и на плюсах не плохо.
если вам понадобилось смотреть потроха класса, значит вы в любом случае будете это делать. насколько там понятный будет код, зависит от квалификации автора. ничто не мешает писать понятный код. откуда у вас такая нужда возникла, это вопрос отдельный, и открытый. явно не из-за декларации в приватной части класса некого френда. существующих возможностей языка выше крыше, для написания понятного кода. похоже, что не. 1. Инкапсуляция данных - это не сокрытие данных. 2. в примере выше у класса был закрыт конструктор. автор этого кода сделал это специально. ваша реакция на это показывает, что вы не осознаете сути момента. в частности: вот именно для этого конструктор и был сознательно закрыт его создателем. что бы такие как вы, которые не в теме, не смогли отстрелить себе ноги. Добавлено через 1 минуту спасибо за заботу. правда я уже староват для таких советов.
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
01.08.2015, 17:47 | 89 |
Ну добавь туда что-нибудь
А вообще, все уже было сказано, повторяться не буду. Читай еще раз сначала. Добавлено через 2 минуты Нет, это называется ограничение на использование. Когда класс запрещают копировать - делают это по той же причине. Ограничивают использование. А нужно это оказалось настолько, что в новой редакции языка добавили возможность делать это из коробки.
0
|
01.08.2015, 17:59 | 90 | ||||||||||
Да я код читаю, из него ничего не понять что вы хотели продемонстировать... пример фиг знает чего, ради не знаю чего.
Добавлено через 2 минуты Ок, тогда насколько понятен этот код? И можно его улучшить/переписать/сделать понятнее? Вспомогательное
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
01.08.2015, 18:10 | 91 |
Там еще текст был. И этот текст связан причинно-следственной связью с предыдущим обсуждением и конкретно твоими словами об ограничении на доступ для friend конкретных полей или функций:
Этот пример поясняет логику, которая применяется для friend. Показывает что из себя friend представляет. Потому что попытка задуматься о таком, как в цитате выше, показывает, что ты неправильно понимаешь назначение friend в языке. Ты его воспринимаешь как "раскрывашку" данных кому не попадя, когда на самом деле это всего-лишь дополнительный способ описания интерфейсов. А неправильное применение как раз вытекает из понимания friend как простой раскрывашки данных. Если мы начнем относится к friend функциям\классам как к части интерфейса, то все станет на свои места.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||||
01.08.2015, 18:52 | 92 | |||||||||||||||||||||||||
там в обоих случаях дизайн принципиально не отличается.
различие лишь в незначительных технических деталях:
в обоих случаях, в качестве фабрики использованы свободные функции. в обоих случаях они - часть интерфейса класса единственная разница в том, что статическая-функция член существует в пространстве имени своего класса а функция друг - вне пространства имени класса. никаких других отличий в данном случае нет вообще. господин DrOffset, безуспешно пытается донести до вас, что друг класса - это на самом деле такая же полноценная, и полноправная часть класса, как и другие его части. недаром, что функцию член можно определить прямо в теле декларации класса:
однако поскольку, часто френдами злоупотребляют, сливая потроха кому ни поподя, нарушая инкапсуляцию, и превращая таким образом код в лапшу, то это и породило миф якобы о том, что френды - зло, и нарушают инкапсуляцию. Добавлено через 39 минут да вроде все понятно: есть 3 штуки элементов, связка которых определяет модель данных. и есть манагер, в который вынесена вся логика организации связей. видимо, создатель решил вынести лапшу связанную с организацией связи в одно место, что бы не размазывать по всем этим классам. с точки зрения архитектуры - вполне себе нормальны ход. однако, я противник подобного дизайна:
кто захватывал, тот и должен освобождать. я за то, что бы не использовать указатели там, где по смыслу ожидаются живые объекты.
2
|
01.08.2015, 19:01 | 93 |
Так в том то и дело что нет явного владельца. Ибо логично что ребро не может сущетвовать отдельно от графа и от двух вершин которые оно соединяет.
Касательно указателя указателя так так и должно быть, указатель в обычных случаях может стать невалидным (Удаляем "родителя" удаляются "дочки", в данном случае у ребра два родителя, а с учетом графа - три)
0
|
01.08.2015, 19:15 | 95 |
hoggy, Я с этой специально и привел пример с сильносвязными объектами.
Добавлено через 2 минуты Ну полноценной она вряд ли может быть (хотя бы из выноса из пространства имен) и даже так, а как тогда трактовать дружественный класс? Добавлено через 3 минуты В этом и проблема что как раз четко описать/зафиксировать интерфейс общенния/связей в нужной мере для двух и более классов нет возможностей. Добавлено через 1 минуту Ну так чет не уловил, в чем суть замены указателей ссылками?
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
01.08.2015, 19:45 | 96 | |||||
ну вот взять например, итератор:
но логически (и на практике) - это часть интерфейса самого контейнера. лучше отражает намерения автора кода, и контракты. например, никто не сделает ничайно delete ссылке, которую вернула функция. и у пользователя не возникнет сомнений касательно прав владения ресурсом.
0
|
01.08.2015, 20:08 | 97 |
Нет это не так.
Это прослойка/интерфейс между контейнерами и алгоритмами. Т.е нечто то что смещенно в сторону алгоритмов. Само по себе существование итератора в отрыве от алгоритмов - нелепо. Как к примеру и friend оператор. friend это такие себе "мостики" между несколькими "сущностями". И пример DrOffset с использованием friend мне не понятен, мне кажется это необоснованным тем более кода есть альтернатива со статическим методом. Да смысла в том что запрещать использования создания через конструктор я не уловил. Только для запрета копирования? Так есть для этого прием NonCopyable причем которые не запрещает создавать объекты "не динамически". Если подразумевалась фабрика/фабричный метод, так там по сути несколько классов, т.е дружественность на своем месте, месте "посредника". Хотя там и без дружественности вероятно можно обойтись...
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
01.08.2015, 20:13 | 98 | ||||||||||
владелец - граф.
который является контейнером для всех этих ребер и вершин. он создает вершины/ребра. он и должен их прибивать. обратите внимание:
они в принципе не могут существовать отдельно от своего графа. их возможные взаимосвязи - детали реализации контейнера. то есть, кто там кому дочкой приходится - это уже внутренняя абстракция разработчика контейнера. вызывающую сторону не касается. наружу, как и любой другой нормальный контейнер, граф выдает только ссылки на свои элементы. и никто снаружи по этим ссылкам не должен их прибивать. хорошая новость в том, что delete ссылкам не делают.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
01.08.2015, 20:27 | 100 |
забудьте на минуту слово "алгоритм".
оно вам только глаз замыливает. есть контейнер. и есть вызывающая сторона. которая может выполнять манипуляции над контейнером. все действия над контейнером осуществляются посредством его интерфейса. например, что бы получить элемент контейнера, необходимо использовать его интерфейс. это можно сделать, дернув напрямую функцию-член. или дернув итератор. а в том что касается алгоритмов: в итераторы вынесли нечто общее для всех контейнеров. и стандартизировали. то есть, алгоритмы тупо закладываются на интерфейс контейнеров. я уже не знаю, как вам ещё помочь это понять. представьте себе, что по какой то прихоти программист реализовал с использованием френда, а не на статической функции. в дизайне от этого ровным счетом вообще ничего не изменилось. это два разных способа, которые делают одно и тоже действие. а это вообще не существенно для примера-иллюстрации. Добавлено через 54 секунды так же как и создавались - через граф.
1
|
01.08.2015, 20:27 | |
01.08.2015, 20:27 | |
Помогаю со студенческими работами здесь
100
Метод абстрактного класса не видит переменные дочернего класса Вызов функции класса, который наследуется от абстрактного класса Как инициализировать члены класса, являющегося параметром шаблона Как обратится к объекту класса Как обратиться к конструктору абстрактного класса Как вызвать функцию из абстрактного класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |