![]() |
|
|
![]()
|
|
| Нитонисе |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Есть класс А, у которого имеются потомки класс В и класс C.
Есть также класс D, одна из операций которого выглядит так
то есть класс D должен работать с наследниками класса A. Теперь пишу такой код
Компилятор ругается на последнюю строчку
как мне научить класс D работать с разными потомками класса А? Это сообщение отредактировал(а) Нитонисе - 2.11.2010, 19:20 |
||||||
|
|||||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
дело в том, что B и C являются А, но А не является ни B, ни C (Ту134 - самолет, но самолет - не обязательно Ту134)
в чем полиморфизм? в том, что принимая аргументом A* и вызывая виртуальную функцию, будут работать методы B или C, в зависимости от типа.
так:
|
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
baldina, так получается что работает метод, реализованный в классах В и С. Это не совсем то, что мне нужно. Мне нужно чтобы работал метод, реализованный в D.
Добавлено @ 19:45 То есть изначально метод класса D не знает какой именно потомок класса А будет его аргументом. Действует позднее связывание, тип аргумента определяется по факту переданного в метод указателя. Это сообщение отредактировал(а) Нитонисе - 2.11.2010, 19:46 |
|||
|
||||
| Artemon |
|
||||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Класс D вообще никак не участвует в наследовании, поэтому требование просто не корректное.
Пример который тебе показали, на 100% соответствует этому -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Пример-то верный, только он немного не в тему. Мне надо чтобы метод D::method(A*) работал с собственными данными класса D, а по типу своего аргумента определял как именно с ними нужно работать. Я так понял у меня изначально постановка задачи неверная. Нужно сделать по примеру, который расписал baldina, а в реализации метода D::method(A*) выполнять проверку типа аргумента. Если указатель на B - то один набор операций, если это указатель на С - второй набор операций. |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Не очень хорошая идея делать проверки. Зачем вам тогда полиморфизм ?
Вам нужно чтобы все производные классы (в вашем случае A и B) умели возвращать данные через одинаковые методы, тогда вы сможете сделать следующее (немного переделал пример для понятности):
Это сообщение отредактировал(а) Artemon - 2.11.2010, 20:58 -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Не, тут дело в том, что проблемы вызвать нужную функцию из семейства А,В,С нет. Есть проблема правильно выполнить метод D::(A*). То есть в зависимости от того, какой фактический указатель передается в метод, я выполняю разные операции.
|
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Зачем тогда вообще нужны классы A и B
Передавайте в метод класса D элемент из перечисления enum EActions { eAction1 = 0, eAction2, eAction3 }; void method (EActions a) { switch(a) { case eAction1: data += 1; break; case eAction2: data += 2; break; } } -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Все уже сказано выше, лично мне добавить нечего. -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
не все http://liveworkspace.org/code/ca23ab383de6...54a82098539f3d6 Это сообщение отредактировал(а) mes - 3.11.2010, 10:51 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
mes, пример хороший и правильный. к сожалению, он вряд ли поможет ТС, а может и навредит, потому что
где B и C имеют общего предка, скорее всего следствие ошибок проектирования. те редкие случаи, когда это действительно нужно, возникают на более высоком уровне абстракции, когда про полиморфизм в С++ ясно все и понятны его недостатки. если я неправ, хотелось бы не технический, а жизненный пример |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Перенесите разные части того, что нужно исполнять в классе D в классы B и C (в виде виртуальной функции, описанной в классе A), и вызывайте ее из D::method(A*)
|
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Это было бы неудобно, так как метод соотносится с классом D и работает с его данными. Работать данными метода D в классах В и С - как-то не корректно. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
т.е. D, B и C связаны по смыслу, так? можно использовать дружбу. но т.к. разработчик всех трех (четырех) классов один и может целиком влиять на проект, лучше изменить дизайн. например: почему B и C не могут использовать общедоступный интерфейс D? Добавлено через 1 минуту и 52 секунды я бы даже усилил: B и C связаны с D. при этом A не связан с D? или связан с чем-то более общим, чем D, но это не отражено в проекте? |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
baldina, возможно архитектура классов у меня и не оптимальная, надо подумать, но интересовала именно техническая реализация моей задумки (пусть и не лучшей).
Что касается задачи - D производит некоторые вычисления, для которого требуются различные потомки А. При чем от конкретного типа потомка зависит алгоритм вычислений, при это из этих самых потомков А берутся некоторые данные. Результаты вычисления хранятс в D. Пока реализовал все это через проверку типов, по аналогии с последним вариантом, что тут выкладывал.. ну а дальше посмотрю, может что-то более дельное в голову придет) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
ну тогда может поделитесь задачей, а не условными классами А,Б,Ц,Д.. ? может кто подскажет что в таком случае подойдет.. |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Задача техническая. Цель - расчет балки - определение в ней внутренних усилий от нагрузки. Класс А - это класс Нагрузка. Классы В и С - это производные от класса Нагрузка - ТочечнаяНагрузка и ЛинейнаяНагрузка. Класс D - это, собственно балка. Таким образом запись Балка::РасчитатьУсилия(Нагрузка*) - вычисляет усилия в балке от аргумента. Причем в зависимости от конкретного типа аргумента (ТочечнаяНагрузка или ЛинейнаяНагрузка) выбирается свой алгоритм. В расчетах фигурируют такие параметры как ДлинаБалки (принадлежит классу Балки), а также ЗначениеНагрузки и ПоложениеНагрузкиНаБалке (это данные принадлежат семейству классво Нагрузка). |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
помимо расчета нагрузки балка что еще умеет ?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Классическая задача на multimethod (или double dispatch). См. http://en.wikipedia.org/wiki/Multiple_dispatch http://en.wikipedia.org/wiki/Double_dispatch
NB. Это конечно в том случае, если и Балка и Нагрузка по отдельности еще что то умеют Это сообщение отредактировал(а) xvr - 3.11.2010, 17:04 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
вариант mes как раз на подпорки из-за отсутствия мультиметодов в С++ или поддержки аспектно-ориентированного подхода |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Пока я до конца с ее функциями не определился, сейчас она вычисляет усилия от n-го количества нагрузок, некоторые расчетные параметры, которые не зависят от нагрузки, но используются в более сложных расчетах, рисует себя на канве, ну и предоставляет всем данные о себе (длина, внутренние усилия). Объекты класса Нагрузка пока ничего делать особого не умеют, кроме предоставления всем информации о себе и рисования себя. Добавлено через 34 секунды Ох с инглишом туго |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
но таки ругань в сторону ТС была неоправдана, каюсь. double dispatch нужен, так что visitor в помощь
Добавлено через 3 минуты и 40 секунд multimethod это множественный полиморфизм, когда функция для вызова определяется не по одному типу, а по нескольким типам аргументов: типа
C++ не поддерживает, для реализации используются подпорки типа visitor Добавлено через 6 минут и 54 секунды а у Нитонисе вероятно это
Добавлено через 10 минут и 11 секунд если от теории к практике, то скорее всего типов элементов может быть много, заранее неизвестно каких, а типы нагрузок известны заранее, так что может быть самое разумное их просто захардкодить в виде отдельных функций для каждого элемента. |
||||
|
|||||
| Нитонисе |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Тут дело в том, что мне в любом случае нужно в классе Балка прописывать алгоритмы обработок тех или иных нагрузок. То есть, я сначала хотел в классе балка сделать так
И в программе использовать так
Но как выяснилось это не работает и теперь я делаю так
Вобщем-то в любом случае, если у меня добавится новый тип нагрузки мне пришлось бы либо объявлять еще один метод calculate(), где в качестве аргумента была бы новая нагрузка. И соответственно новый алгоритм расчета прописывать. Либо в проверку типов (как по второму варианту) включать проверку на новый тип нагрузки и прописывать свой алгоритм. Это сообщение отредактировал(а) Нитонисе - 3.11.2010, 18:14 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
а в чем отличие точечной нагрузки от линейной ?
и вопрос.. библиотека будет логически полной ? или предполагается дать возможность пользователю определять новые сущности ? и еще, что является наследником балки ? Это сообщение отредактировал(а) mes - 3.11.2010, 18:39 |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Точечная нагрузка прикладывается к какой-то конкретной точке балки, соответственно один из параметров нагрузки - координата точки приложения. У линейной нагрузки такого нет - она прикладывается на всю длину. Операции расчета усилий я написал условно, по факту же, если аргумент точечная нагрузка, то наряду со значением нагрузки из нее запрашивается и точка приложения.
Имеется ввиду новые типы нагрузок? Пользователь такой возможности иметь не будет, а я, как разработчик, могу добавить новые типы. На самом деле тут я немного тоже упростил. Любая балка имеет две опоры. Опоры могут быть различные - шарнир, жесткая опора или свободный край (консоль). Так вот наследники Балки - это разные типы с точки зрения опирания. То есть есть такие классы БалкаШарнирШарнир (две шарнирные опоры), БалкаШарнирЖесткая (слева шарнир, справа жесткая опора) и т.д. У каждого типа балки внутренния усилия от одной и той же нагрузки определяются по разному. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
потом окажется, что балки могут иметь разные сечения, потом - учитывать податливость опор...
классификация обширная))) |
|||
|
||||
| Нитонисе |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Это намек, что виды опор можно было сделать свойствами класса Балка, а не плодить потомков?) Может и так, но тут дело в том, что это мой первый проект, где я решил опробовать объектный-ориентированный подход, поэтому где-то обоснованность принятия того или иного решения не важна, а важно практическое знакомство с особенностями ООП - наследованием и полиморфизмом. У меня кстати, в контексте этого объектно ориентированного подхода есть один вопрос. Есть класс А, который является частью В, а В является частью С, который в свою очередь является частью D. то есть такая последовательная вложенность. А есть внешний класс Е, которому часто требуется обращаться к параметрам и А, и В, и С, и D, но логично установить связь всего лишь с верхним классом - D. И теперь получается, что если мне надо получить некоторые данные класса А, выполняя операцию Е, то появляется такая цепочка:
Что-то как-то это коряво выглядит. Это сообщение отредактировал(а) Нитонисе - 3.11.2010, 19:31 |
||||
|
|||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
В вашем случае функции расчета нагрузки не должны быть членами класса 'Балка'. Равно как и членами класса 'Нагрузка'. Это должны быть вообще отдельные сущности, выбираемые по сочетанию динамических типов 'Балка/Нагрузка'
А это динамическое агрегирование (как одна из возможных реализаций). Вы уж определитесь, что у вас 'есть' |
||||||
|
|||||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Ну на простом проекте ООП впринципе не нужен) То есть функция принимает в качестве аргументов объект нагрузки, объект балки и возвращает некий результат? Ну это как вариант... врядли тут могут быть единственно правильные решения. Или вы попробуете обосновать почему именно ваш вариант наиболее предпочтителен? Я привел другую ситуацию. Это уже не о расчете балок. Классы от А до D вложены один в один как матрешки. А есть класс Е, которому нередко нужны данные из каждого из этих матрешек. Мне кажется с таким подходом будут слишком велики накладные расходы по вызову функций возвращающих объект с более низкого уровня (начиная от D и до А). |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
да и на сложном проекте.. не всегда нужно "сырой" ООП пихать всюду... под "сырым ООП" я подразумеваю попытка реализовать ООП средствами языка, нежели проектированием.. понятнее описать не могу.. это надо почувствовать.. вобщем не всегда стоит решать задачу в лоб.. Добавлено через 6 минут и 37 секунд исходя истого что написали: 1. задача по расчету нагрузки на балку вместо двух имеет три компонента, а именно: балка, нагрузка, и площадь соприкосновения 2. наследование от балки, мягко скатать, неэстетичное и стоит отказаться в пользу агрегации 3. функции расчета нагрузки, как уже сказали выше, не относятся к балке... итого в той части задачи, которую Вы описали, полиморфизм притянут за уши, и никакой выгоды вы от него не получите.. Добавлено через 9 минут и 16 секунд
потому, что балка вместе с нагрузкой не обладает достаточными знаниями для решения этого вопроса.. Добавлено через 10 минут и 53 секунды и вобще старайтесь не втягивать зависимости внутрь классов.. чем меньше тем легче поддерживать и развивать проект.. |
|||
|
||||
| Нитонисе |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Так ООП более предпочтительно структурного программирования. Во всяком случае область применения ООП выше. Мой нынешний проект вполне годится для опробирования ООП. Есть действующий аналог со структурным походом, хочу переписать его в объектный. И что должно быть в площади соприкосновения?
В чем будет агрегация? Есть балка, у балки могут быть три типа опор с каждой стороны. Можно типы опор впринципе прописать как свойства балки... но чем это лучше?
Что ж это тогда будет - просто свободная функция?
Не спорю, что он тут реализован неэффективно, но надо хоть почувствовать на своих родных объектах как он работает и в каких случаях какие функции вызываются))
Как же не обладает? Обладает. Достаточно данных нагрузки и балки чтобы определить внутренние усилия.
То есть? Стараться не передавать методам объекта в качестве аргументов других объектов и не содержать в качестве данных класса ссылки и указатели на др. объекты? |
||||||||||
|
|||||||||||
| mes |
|
||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
ООП бывает разное.. ООП - как подерживаемая компилятором парадигма.. ее надо принять там где нужно.. и не злоупотрблять.. и ООП (точнее ООА объектно ориентированный анализ) как способ группировки знаний - тут стоит уделить побольше внимания.. Добавлено через 1 минуту и 7 секунд Я Вас не отгавариваю от ООП, а говорю что не все ее достижения стоит запихивать в одну корзину.. кстати этим вы убиваете ООП как подход... Добавлено через 2 минуты и 14 секунд
наличие кучи наследований не достаточно для установления объктного подхода.. Добавлено через 3 минуты и 42 секунды если балка двухмерная, то длина соприкосновения.. т.е отрезок балки на который воздействуют.. достаточно малый отрезок есть точка.. Добавлено через 5 минут и 19 секунд
ну так смотрите что написали жирным, так и записывайте в программный код, и не нагружайте логику ни себе, ни другим.. Добавлено через 6 минут и 45 секунд если не зависит от какого то мира знаний, то просто свободная функция.. и не бойтесь что это ведет удаляет от ООП, наоборот Вы начинаете использовать его силу.. Добавлено через 8 минут и 17 секунд
неэффективно, это лишь малая доля проблемы.. намного большая проблема - не логично.. Добавлено через 9 минут и 30 секунд
Это в вашем ограниченом варианте достаточно.. а если подумать далеко не так все одназначно.. или весы и на земле и на луне показывают одно и то же ? Добавлено через 10 минут и 59 секунд
нет.. стараться не вносить детали и знания, которые объекту не необходимы.. |
||||||||||
|
|||||||||||
| Нитонисе |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
И зачем такие сложности? Почему нельзя вычислять усилия в объекте Балка с аргументом Нагрузка?
Это значит такой код?
С таким подходом отдельными функциями можно реализовать практически ВСЁ. Будет одна программа, вызывающая другие подпрограммы, которые вызывает более мелкие подпрограммы. Это не ООП, а структурный подход. |
||||||||
|
|||||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
хм.. т.е. из крайности в крайность ?
а ООП и есть структурный подход Добавлено через 6 минут и 37 секунд
потому что реализацию расчета нагрузок для всех видов объектов удобно поместить в одно место, в независимости от классов самих объектов.. А вот стоит ли группировать расчет нагрузок в класс или нет - зависит от реализации.. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Один из принципов ООП (в С++) - инкапсуляция. Это в частности означает, что все операции класса (т.е. операции, использующие и влияющие на состояние класса) должны быть описаны ВНУТРИ класса. Возьмем операцию 'Расчет нагрузки на балку'. Она ни может быть описана ОДНИМ классом (ни Балкой ни Нагрузкой). Она полностью (в том числе и алгоритмически) зависит от обоих этих классов. А это означает, что в рамках ООП в С++ она НЕ МОЖЕТ быть членом ни одного из этих классов.
А это в свою очередь означает, что НЕ НАДО притягивать сюда за уши ООП механизмы С++, нужно строить НОВЫЙ механизм, используя возможности С++ Вы смотрели ссылки, что я давал? Там расписано (в том числе с примерами на С++) как это делать. Еще поищите в сети 'Паттерны программирования' (как то так называется). Должна быть информация и на русском. И еще совет - прежде чем углубляться в дебри паттернов и пр. изучите как следует обычное ООП (в рамках С++). Иначе вы не углубитесь, а утоните Вот, замечательный пример на непонимание основ (или на неумение сформулировать задачу)
|
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
И что ж тогда? Объявить нагрузку атрибутом класса балка? Тогда классу всего хватит, чтобы вычислить усилия в балке от нагрузки. Мне представляется ООП - это куча различных объектов каким-то образом взаимодействующих друг с другом. Причем взаимодействие должно быть обязательно, иначе система попросту не будет работать. Это все равно что поставить в кузов от машины мотор, но не соединить его с ведущей осью - машина никуда не уедет. В контексте моего проекта есть объект нагрузка и есть объект балка. Одно не являются частью другого, они могут существовать независимо друг от друга. При этом нужно уметь посчитать усилия в балке от этой нагрузки. Усилия ведь без нагрузки быть не могут. Значит все слепить в один класс? Но тогда придется все объединять и объединять до тех пор, пока не получится куча различных параметров, характеризующих систему и к этой куче обращается куча подпрограмм, оперирующих ими. Это не ООП, а структурный (алгоритмический подход). Добавлено через 1 минуту и 31 секунду
Перейдем к более конкретным абстракциям. Есть спица, спица часть обода, обод часть колеса, колесо часть шасси. Предлагаете все эти объекты объявить наследниками друг друга? |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
вам уже говорили, ничего лишнего, что не отражает действительно состояние балки..
не совсем правильное представление.. этого не достаточно чтоб называться ООП.. а не думаете ли Вы что взаимодействие это отдельная сущность ? а вот что это класс или функция , надо смотреть по требованиям..
обратите что на соединение идут другие детали/механизмы, а не все пихается в двигатель или в ось.. Вам как раз обратное советуют.. то что Вы описали не структурный подход, а куча хлама..
ни за что кстати покажите цитату после которой Вы сделали такие далеко идущие планы.. Это сообщение отредактировал(а) mes - 4.11.2010, 14:11 |
||||||
|
|||||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
В контексте моей задачи состояние балки характеризуется только длиной пролета и типами опор. Состояние нагрузки характеризуется ее величиной и положением на некоей абстрактной балке. Мне нужно определить внутренние усилия в балке от нагрузки. Каким образом это делать? Помним о том, что другие объекты могут спросить у балки - "А какие у тебя внутренние усилия от этой нагрузки?". |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
вот сейчас я считаю описание задачи составлено довольно ясно и правильно.. и отражает все связи внутри мирка.. и так у нас есть основные сущности
теперь нам нужно построить из них конструкцию в котором можете размещать балку, опоры, и нагрузку ( делать это в зависимости от разнообразия конструкций, можно как динамически, так и статически) и у нее же опрашивать усилие.. вот условный набросок :
Это сообщение отредактировал(а) mes - 4.11.2010, 14:48 |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
То есть надо создавать объект класса БалкаПодНагрузкой, атрибутами которой будут один экземпляр Балки и вектор экземпляров Нагрузка? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
||||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
просто удобно... чтоб явно показать тип.. или почему структ вместо класса ? во первых чтоб не писать лишние паблики, во вторых, модель типа сейчас больше соответсвует именно структуре.. Добавлено через 1 минуту и 35 секунд сделайте конструкцию в которую можно добавить не одну нагрузку.. если я правильно понял ваш вопрос.. |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Впринципе ваша структура близка к моему классу Балка, в чем разница-то?
Это класс одного из потомков балки с шарнирными опорами слева и справа. Метод calcMOneLoad - перегружен, в базовом классе он объявлен виртуальным. В зависимости от типа нагрузки Load производится определенный расчет моментов. Причем если бы балка была например класса BeamHingeRigid (слева шарнир, справа жесткая заделка), то метод calcMOneLoad считал бы уже совсем по другому. А как в вашем примере бышел расчет? Нужно было бы постоянно опрашивать свойство support, чтобы определять тип расчета и плюс к этому опрашивать тип нагрузка Load, чтобы еще одну развилку делать... получится очень ветвистая функция. |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
кстати можно сделать конструкцию, состоящую из других конструкций..
Добавлено @ 14:54
а Вы попробуйте написать в этом стиле , и увидите Добавлено @ 14:56 во первых Вам не нужно будет жестко наследоваться от балки, ради балки с двумя опорами - этого уже достаточно.. Добавлено @ 14:57
если сделать структурой то да.. если классом (т.е. убрать состояние в приват) то только при изменении составляющих.. Добавлено через 6 минут и 10 секунд
а чтоб не делать развилок, для этого тоже есть решения Это сообщение отредактировал(а) mes - 4.11.2010, 14:57 |
||||||
|
|||||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
mes, дело в том, что я больше знаком с предметной областью и мои решения происходят именно от этого знакомства. Сюда я выкладываю только небольшую толику темы, так как он специфична и многим будет попросту непонятна. Ведь те описания объектов и те связи, которые я тут показал - далеко не полны. Их будет много больше, равно как и объектов будет тоже намного больше.
Если интересно, могу полностью описать систему. Необходимо рассчитать многопролетную балку методом перемещений. Есть некий графический интерфейс, который позволяет задавать новые пролеты, редактировать их, задавать типы опор. Есть графический интерфейс, регулирующий нагрузки, там можно задать тип нагрузки и ее характеристики. При этом нагрузки задаются в контексте уже заданных пролетов, то есть если нагрузка выходит за пределы пролета, то она попросту не добавляется. Нагрузки так же можно группировать в комбинации посредством еще одного графического интерфейса. То есть можно рассматривать балку нагруженную разными сочетаниями нагрузок. Вся эта расчетная схема сразу же после получения данных или их корректировки отображается в графическом окне на канве компонента TImage. Если балка статически неопределима - производится ее расчет методом перемещений. Этому методу нужно работать со всеми данными по балке (с пролетами и с нагрузками). После решения балки методом перемещений можно определить внутренние усилия в сечениях балки (в каждом ее пролете) с заданным интервалом. Наборы усилий должны сохраняться, так как их будут запрашивать другие объекты (например подбор металлической балки). После решения балки результаты немедленно должны отрисовыватьс в графическом окне в виде эпюр (график распределения внутренних усилий по длине балки). Задачу необходимо решить таким обьразом, чтобы было затем удобно осуществлять сопровождение программы, модифицировать ее, расширять функционал. Так же нужно разработать объекты, которые было бы возможно применять в других программах. Например простая однопролетная балка. Если мне в другой программе понадобится считать такую балку, я хочу чтобы у меня было уже готовое решение - балка, которая умеет в самой себе определять усилия от заданной нагрузки. Так же отдельно и независимо должен быть реализован метод перемещений. Я могу захотеть решать балку другим методом (например метод сил) и нужно чтобы он легко интегрировался в общую структуру, без существенных изменений. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
все что описали, не совпадает с теми примерами, которые Вы приводили.. т.е несмотря на то что есть достаточно полное описание задачи, код не представляет такой же ясной модели.. Добавлено @ 15:32 вот например акак реализована эта подзадача
? Добавлено @ 15:33
ну вот сами говорите, что должен быть свободной функцией.. или самостоятельным классом.. остальное оставлю без коментариев, так как много букв.. Это сообщение отредактировал(а) mes - 4.11.2010, 15:35 |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Кода пока и нет - я его только разрабатываю. Нагрузка добавляется в вектор, приписанный (через указатель) к конкретному пролету. Если положение нагрузки выходит за рамки этого пролета - нагрузка не добавляется. Пока не решил к какому объекту определить эту операцию. Да это не то что функция, это целый набор функций. Но это касается метода перемещений, а есть расчет статически определимой балки, он не требует метода перемещений. Вот усилия в статически определимой балке от заданной нагрузки я и хотел вычислять методом класса Балка. Вот в том-то и дело, что вы советуете те или иные решения основыаясь на гораздо меньшей информации чем я. Я не говорю, что мои решения супер, но ваши имели бы бОльший вес, если бы вы глуюже вникли в задачу. Понятно, что это трудоемко и вы этим заниматься не станете, потому концептуальные решения нам не обсудить, а вот частности, особенности реализации - вполне. Вот меня интересует абстрактный пример. Есть класс Фигура. Частные варианты Фигуры - это Квадрат, Круг, Треугольник. Что лучше - объявить потомков от Фигуры, или создать атрибут ТипФигуры, принимающий одно из трех значений - Круг, Квадрат, Треугольник. Как мне кажется первый вариант лучше, потому что позволяет затем использовать перегруженные функции, например draw(). Ведь во втором варианте в функции дро пришлось бы проверять атрибут ТипФигуры и в завивисимости от него идти по тому или иному пути, то есть цепочка if..else. Та же история с балками. Опоры у балок могут быть разные. Что лучше - породить потомков с перегруженными функциями расчета усилий или объявить аргумент в класса Балка, указывающий на тип опор... логика та же, что и с фигурами. Возможно отличия базового класса от потомков тут незначительны, но ведь в будщем могут появиться новые существенные отличия, которые я сейчас не могу предположить и тогда модифицировать код было бы намного проще имея структуру потомков и предков, чем заданные атрибуты в одном классе. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
Зависит от задачи, если это к примеру графический редактор, то да, удобнее если наследуются от класса фигура..
Есть вариант, когда у класса фигура может не быть своего метода draw.. тогда когда отображение зависит не только от внутреннего состояния.. Добавлено @ 16:08 логика не та же... чтоб была таже : у нас есть фигура_прямоугольник, он может быть с бордюром, может с закругленными краями может иметь разный цвет.. Будем для каждой композиции атрибутов заводить свой класс ? Добавлено через 6 минут и 23 секунды в той иерархии классов с балками, позже Вы не сможете ничего изменить, так как все будет завязано друг на друга.. Добавлено через 13 минут и 54 секунды т.е все на весу ? а не легче ли сделать класс, который эту логику проведет ? Это сообщение отредактировал(а) mes - 4.11.2010, 16:09 |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Я думаю, что если особенности реализации того же рисования существенно отличаются, то можно наплодить потомков, а если не очень (как например цвет), то можно это задать атрибутом. А вы по какому принципу плодите потомков? Приведите пример.
На каком весу? Я просто еще не решил как это будет реализовано, обозначил пока только задачу. Возможно отдельным классом буду это обрабатывать. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
мне не нужно вникать полностью в задачу.. для общей картины достаточно ясной постановки задачи.. Добавлено через 4 минуты и 27 секунд по описанию задачи и в зависимости от требований ей поставленных.. |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Какое слово в предложении 'НЕ МОЖЕТ быть членом ни одного из этих классов' не понятно? Я уже 2 РАЗА давал одни и те же ссылки, вы с ними ознакомились?
У вас должен быть ОТДЕЛЬНЫЙ БАЗОВЫЙ КЛАСС ДЛЯ ПОДСЧЕТА УСИЛИЯ. И их (этих отдельных наследников классов), должно быть столько, сколько существует возможных комбинаций <типов балки>х<тип нагрузки>
Это сообщение отредактировал(а) xvr - 8.11.2010, 16:01 |
||||||
|
|||||||
| Нитонисе |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Что же этот класс делает? Считает усилие и все? Функционал сопоставим с единственной функцией, тем более что внутреннее состояние этого класса никому не интересно, кроме самого этого класса. Все вокруг хотят только усилие от этого класса. Проще сделать уже отдельную функцию
перегруженную столько раз, сколько у меня сочетаний Балка-Нагрузка (сочетаний всего 18 на сегодняшний день). При этом внутри функции будут постоянно идти обращения к оюъектам Балка и Нагрузка с целью запросить те или иные данные (длина балки, значение нагрузки, точка приложения нагрузки). Представьте, что мне усилие нужно считать в цикле на 100 нагрузок... не велики ли будут накладные расходы с этими вызовами?
Я говорил именно об агрегации, это вы решили обернуть это наследованием. Мне нужно чтобы внешний объект имел хороший (быстрый) доступ ко всем составляющим одного целого - матрешки. Внешний объект должен легко получать данные как из самой большой матрешки, так и из самой маленькой. Так вот если нужно получить данные из самой маленькой - будет та цепочка вызовов, о которой я писал. А я писал всего один раз - с английским на "вы" |
||||
|
|||||
| xvr |
|
||||||||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Да
Пример:
http://ru.wikipedia.org/wiki/%D0%9C%D1%83%...%82%D0%BE%D0%B4 http://www.rsdn.ru/article/cpp/multimethods.xml http://www.google.ie/search?q=%D0%BC%D1%83...lient=firefox-a (3550 результатов) http://www.google.ie/search?hl=en&clie...q=&gs_rfai= (7890 результатов) Это сообщение отредактировал(а) xvr - 9.11.2010, 16:06 |
||||||||||||||||||||
|
|||||||||||||||||||||
| Нитонисе |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Тогда просто эта цепочка будет скрыта в реализации класса. Меня как раз именно неказитсая реализация смущает. А именно - вызовы функций, возвращающие объекты более нижнего уровня. Например мне надо узнать параметр data из класса D на самом нижнем уровне, тогда получается такая цепочка
Надо почитать. |
||||
|
|||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
|
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Скрыть-то можно, но я все о накладных расходах по получению нужной информации. Что бы получить данные data из класса с самого нижнего уровня надо в 5 раз больше времени, чем просто использовать эти данные по имени переменной (допустим глобальной). |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
если вызовы не виртуальные, компилятор сам все что можно соптимизирует.. пишете чтоб было логично.. если и возникнут где то проблемы, при логично написанном коде, всегда можно нужные места скорректировать.. Добавлено через 1 минуту и 35 секунд
а не надо получать каждый элемент отдельно.. за один раз получаете структуру 4го уровня, и оперируете уже с ней |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
хм.. на абстрактном примере неудобно объяснять.. грубо говоря не бойтесь делать вложенные функции.. Добавлено через 8 минут и 40 секунд ну а применительно к вашей задаче, думаю, будет удобно разбить на два слоя : нижний - уровень формул, где все связи статические.. верхний - уровень визуализации, полиморфно объединяющий сущности нижнего уровня.. Добавлено через 12 минут и 36 секунд могу показать на примере, если приведете полностью формулу расчета нагрузки .. |
|||
|
||||
| Нитонисе |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Попробуйте) Только формула не расчета нагрузки, а расчета усилия от нагрузки. Вот функция, определяющие опорны моменты от нагрузки. Формула подсчета определяется на первом этапе в зависимости от типа опор, а затем от типа нагрузки. Вот эта ужасная функция
результаты расчета по ссылкам m1, m2 заносятся во внешние переменные. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
||||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Так в этой функции ничего кроме ормул и нету собственно) В зависимости от типов опор и типа нагрузки. Я не совсем понял что вы имели ввиду, ну тогда вот вам одна формула, для расчета опорных моментов от точечной нагрузки на балке с жесткими опорами.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
нет там куча лишних деталей, на разбор и обдумывание которых неохота тратить время.. вот а где эта зависимость ? чем выражена ? Добавлено через 2 минуты и 55 секунд напишите формулу, без учета ваших классов..мне интересны какие данные необходимы.. Добавлено через 3 минуты и 52 секунды
мне не нужна для конкретной опоры.. мне нужна общая.. Это сообщение отредактировал(а) mes - 9.11.2010, 20:51 |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
В кучке сравнений if...else... в зависимости от выбранного пути - свой расчет. Так вот в том-то и дело, что общей формулы нету. Есть 18 частных формул. В кажой из этих формул используются разные данные и они по разному обрабатываются. |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
У Вас же не вымышленные расчеты ? от чего зависит в реале ? Добавлено через 2 минуты и 2 секунды не верю © есть хотя бы логическое описание происходящего.. опять свою реализацию подставляете ?
прям уж так разные ?! Добавлено через 3 минуты и 12 секунд а также вопорос, что у Вас будет кроме балок, куда можно приложить нагрузку ? и чем кроме вида и названия они отличаются от балки .. Добавлено через 10 минут и 55 секунд взял для примера пару расчетов из вашей функции
видно что единственное чем отличаются расчеты для Rigid и Hinge это коэффициент (8 или 12). Добавлено через 12 минут и 5 секунд
для третего типа опоры то же самое.. |
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
да и вот тут явно общность видна.. и в осзтальных местах тоже.. и где ж хваленное знание предметной области ?! Это сообщение отредактировал(а) mes - 9.11.2010, 22:52 |
|||
|
||||
| Нитонисе |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Вот в реале усилия и зависят от типов опор и от типа нагрузки) Ну, тут я вам помочь ничем не смогу, кроме того, что отослать к учебникам по сопромату и теоретической механике) Существуют аналитические решения балок частного вида. Частный вид - это однопролетная балка с определенными опорами и с определенной нагрузкой, приложенной определенным образом... вообщем я думаю не имеет смысла углублятся в объяснения, потому что они все равно не будут исчерпывающими. Да - разные. Например чтобы обработать линейную нагрузку на всей балке нас интересует только длина балки и величина нагрузки. Этого достаточно чтобы вычислить опорные моменты. Однако расчетные формулы зависят от типов опор. Если же мы считаем усилия от точечной нагрузки, то кроме значения нам еще надо и привязка нагрузки к одной из опор, а если мы считаем линейную нагрузку на части балки, то нам нужно знать привязку этой нагрузки к опорам и длину приложения. Подмножество типов нагрузок может быть дополнено еще довольно значительным количеством нагрузок, которые встречаются значительно реже, но все же.
В данной задаче - только к балке. В других программах - это могут быть и балки и плиты и много чего еще, но там, вероятно, нужно будет использовать свою структуру данных, так как описание нагрузки для задания на плоскости совсем другое, нежели описание нагрузки на стержне.
Добавлено через 1 минуту и 39 секунд
К чему вы клоните? |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
вот одно узнали.... значит для всех стержней расчет одинаков ? Добавлено @ 00:03 а я разве говорю не существенно ? я говорю о том что опора характеризуется коэфицентом чего то.. чего именно Вам видней.. Вот вроде и второй пункт решен.. Добавлено @ 00:05
все это спокойно выражется в формуле.. грубо говоря Вам не надо знать тип нагрузки, а нужно лишь знать точки приложения.. Добавлено @ 00:10 К тому что Вы не проработали вопрос, и пытаетесь его решить в лоб, несмотря на то, что даже само решение показывает Вам, иль даже кричит, что надо не так Добавлено @ 00:11 Как подсказка, забудьте про классы, и напишите расчетные функции (пусть несколько если легче), только на основании необходимых передаваемых в них данных.. (объединять данные можно только в простые структуры) Это сообщение отредактировал(а) mes - 10.11.2010, 00:36 |
||||
|
|||||
| Нитонисе |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Нет. Все расчетные формулы, интересующие меня на данном этапе, я привел в своей большой функции чуть выше. Вы считаете это одинаковые формулы? Хм
Какой пункт? Я теряю вашу нить рассуждений)) Что касается 8 и 10 - это эмпирические выражения, они ни от чего не зависят и постоянны при данных опорах балки и данном типе нагрузки.
Ну что ж, сказали А, скажите и Б. Есть балка, две жесткие заделки по краям. Нагрузка может быть точечная (DotLoad), а может быть линейная по всей длине (LinearLoad). Покажите как будет выглядеть единая универсальная формула (как выглядят частные формулы можно посмотреть в моей большой функции). |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
даже если функций несколько, они то для всех стержней одинаковы ? при наличие других стержней, кроме упомянутой однопролетной балки.. Добавлено @ 01:15
значит зависят по таблице.. Добавлено через 5 минут и 34 секунды т.е. Вам не только подсказать, но еще и сделать за Вас ?!
Для начала приведите свои функции в читабельный вид... Добавлено через 6 минут и 3 секунды лазить в такой грязи и разбираться, жаль зрения.. Добавлено через 11 минут и 21 секунду кстати покажите что у вас сейчас внутри классов опор.. Добавлено через 12 минут и 6 секунд и перечислите какие типы опор бывают.. Добавлено через 12 минут и 23 секунды кроме тех трех что уже упомянуты Это сообщение отредактировал(а) mes - 10.11.2010, 01:16 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
к тому же у вас сейчас повторение для симметричных функций относительно типа опор..
|
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
mes, вобщем-то не имеет смысла обсуждать этот вопрос дальше, так как для того чтобы вы поняли о чем идет речь - вам придется освоить профессию расчетчика строительных конструкций. Что касается меня, то я работаю с этими расчетами регулярно, так как это является моей основной профессией.
А вот это интересно) Что, по вашему, является грязью в моей функции расчета усилий?) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
||||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
ну если не хотите продолжать Ваше дело.. ну а мне не надо становиться расчетникoм.. это Ваша задача.. а для того чтоб отличить логичный код от нелогичного, мне формулы не нужны.. разве что описание доменной области, и то чтоб подсказать, как лучше выразить в терминах языка.. Добавлено @ 01:36
меня не смущает размер самой функции.. (исправить это дело 5ти минут) но возьмем любой блок
это самый простой и то выглядит, глаз сломать можно.. Добавлено @ 01:40 ну я так понимаю.. вы не понимаете как исправить ситуацию.. ну давайте вместе.. я буду писать условия, вы код, а я подправлять.. посмотрим что получится.. для начала возьмем самое простое, линейную нагрузку и жесткие опоры.. Добавлено @ 01:42 только без непонятных цифр, как например 12.. если это констатнта, значит давайте соответсвующее имя.. Это сообщение отредактировал(а) mes - 10.11.2010, 02:20 |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
что то я не дождусь.. сделаю первый шаг :
для двух других видов опор, будет меняться лишь коэфициент ? тогда я так понимаю будет :
Это сообщение отредактировал(а) mes - 10.11.2010, 02:15 |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Вы так и не написали вариант, когда "глаз не ломается")) Ну, если вам понятнее символьный язык - ваше дело, мне понятнее цифры) они однозначны, да и код короче, нагляднее и привычнее (с точки зрения реальных расчетов).
К чему это приведет? К запутанной структуре функции. Сейчас в ней все прозрачно - идет проверка типов опор и для уникальной пары четко прописаны опорные усилия. В вашем же случае можно сократить код, но он потеряет наглядность... дело вкуса. Мне видится оптимизация только в выделении отдельных блоков в отдельные же функции. Это сообщение отредактировал(а) Нитонисе - 10.11.2010, 02:22 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
почитайте про антипаттерн "магические числа" Добавлено через 1 минуту и 18 секунд для этого я должен прдставить картину взаимосвязей, а ее Вы пока не описали Добавлено через 3 минуты и 36 секунд
ок.. давайте отолкнемся от этого.. и так у нас три вида опор, три вида нагрузок и конструкция состоящая из стержня/балки и двух опор . опора не имеет своих данных, но от нее зависит какую формулу применить.. так? |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Вы просто не понимаете природу этих цифр, поэтому хотите их убрать из выражения. Но они абсолютная константа и не поменяются никогда. Даже такая константа как 100 обозначающая количество копеек в рубле - менее постоянна, чем эти числа. Ведь кому-то может придти в голову сменить соотношение рублей-копеек. А если кто-то решит сменить коэффициенты в формулах, то ему придется сменить и саму формулу. Второй же сомнительный плюс - уменьшение количества кода путем запутывания его структуры. Несмотря на то, что вы нашли схожие выражения в разных формулах - это не даст дивидендов, потому что все равно эти выражение должны быть включены в свои разделы. Если попытаться их объединить, то получатся сложные и неочевидные с первого взгляда конструкции. Имею ввиду в первую очередь условия условных переходов. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
возможно.. тогда не плохо было бы уточнить при показе кода.. например комментом, чтоб предупредить о подобном, тех кто не в курсе..
мы пока не запутываем, а разбираемся.. потому что условия пока не понятны.. но потихоньку просветляется.. |
|||
|
||||
| Нитонисе |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Вот общая конструкция моей функции
Я тут не показал еще переменную report, которую возвращает функция. Она равна 0 - если вычислить усилия не удалось и 1 - если удалось. Конструкция очень прямая - тупой перебор всех возможных сочетаний нагрузок и типов опор. Попытайтесь упростить общую конструкцию на основе выявленных вами математических закономерностей. Я даже подскажу их вам больше - везде, где опора шарнир (Hinge), либо консоль (Free) соответствующее усилие всегда равно нулю. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
как раз эта часть и так понятна..
вот ее надо было еще на прошлой странице озвучить
почему математических ? вполне возможно табличных закономерностей. Добавлено @ 13:18 итак для начала определим функции расчетники :
Это сообщение отредактировал(а) mes - 10.11.2010, 13:19 |
||||||
|
|||||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
думаю Вам удобнее суппорт ассоцировать напрямую с ид (т.е. или самого сделать целочисленной константой/енумом или ее возврающим )
тогда база будет выглядить примерно так
в скобках необходимые параметры, а в конце реализация..
Добавлено @ 14:20 тут будет связь с расчетниками... чуть позже напишу. Это сообщение отредактировал(а) mes - 10.11.2010, 14:28 |
||||||
|
|||||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
вот в общей функции :
теперь нужно подумать что еще можно "съэкономить" Это сообщение отредактировал(а) mes - 10.11.2010, 16:07 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
вот подправлено немного :
Это сообщение отредактировал(а) mes - 10.11.2010, 16:06 |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Мне вообще-то непонятно - а что вы тут сэкономили то? Закрывая глаза на сложную для восприятия структуру кода можно отметить следующее - суть ее аналогична моей. Вы так же проверяете типы опор и тип нагрузки, запуская те или иные обработчики. Только я не совсем понял одну вещ. Вы проверяете первую опору switch (s2), но не проверяете вторую switch (s2[1]), хотя от этого зависит алгоритм вычислений... Вобщем оформление кода - дело субъективного восприятия. Вы не можете читать мой код, я не могу читать ваш код. Что же касается "красивого" решения вопроса вызывания нужной функции вычисления усилий в зависимости от типов опор и типов нагрузки - смотрю в сторону мультиметодов. Очень интересная тема, надо с ней поподробнее разобраться) |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
пока мало чего.. не торопитесь.. я еще не закончил Добавлено через 44 секунды
смотрите внимательно.. проверяются обе.. Добавлено через 4 минуты и 21 секунду возвращаемся к ns_calc_moment и добавляем туда функцию
|
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Не трудитесь) Я уже вижу по вашему стилю, что он для меня неприемлем. Масса малопонятных однобуквенных обозначений, сложные программные констркции. Может вы что-то и сэкономите, но такую цену (сложность восприятия) я платить не готов)) Да и вопрос то был нев экономии, а в "грязном" коде. Сэкономить можно проще - просто вынести расчетные блоки в отдельные функции. Для меня не страшно большое количество кода (пусть и разбросанного по разным функциям), для меня важнее его понятность, эффективная работа, удобная модификация. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
тогда станет :
Добавлено через 3 минуты и 23 секунды чтоб избежать лишнего расчета для rr, придется немножко лишнего кода написать.. |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
после поправки :
Это сообщение отредактировал(а) mes - 10.11.2010, 16:51 |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
итак у нас получилась вспомогательная функция :
и основная
Добавлено @ 16:49 вот к последнему варианту можете придераться Это сообщение отредактировал(а) mes - 10.11.2010, 16:53 |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Да я в общем-то уже "придрался" - код не облегчился и стал сложнее, "заковырестее". Я не вникал в правильность реализации отдельно взятых функций (точнее в определнии верного пути к нужному блоку), так как для меня такие программные конструкции не читаемы, жалко времени. Всущности организация кода должна быть понятна вам и совсем не обязательно, чтобы она была понятно кому-то еще, если только вы не работаете в команде. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
да кода стало чуточку больше.. 1. но мы избавились от медленного динамик_каста, 2. автоматизировалась часть по выбору нужной ветви 3. компилтайм проверка, для всех лоадов, о наличии реализации для конкретного потомка (патерн визитер) 4. все функции расчетники выведены из в отдельную область.. (ах да про них забыл.. с учетом последних изменений они должны иметь вид аналогичный : float rrl (size_t len, linear_load& l)); 5. в отличие от мултиметодов, для которых еще чуточку кода добавиться, мы использовали "знание о riget" "заковырестей" он стал для Вас, но зато стал более "сопровождаем" хотя по сути ничего сложного нет, если понять суть на которой он основан Это сообщение отредактировал(а) mes - 10.11.2010, 17:26 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
да кстати в моем выбор функции не до конца верен. поздно заметил, что при других типах нагрузки, для rr моменты не равны.. сейчас времени нет подправлять..позже..
Это сообщение отредактировал(а) mes - 10.11.2010, 18:06 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
http://liveworkspace.org/code/36203ae8fe26...a690733c9408081
вот расчет для линейной нагрузки, для произвольного сочетания двух опор.. Добавлено @ 20:06 вместо цифр (3,4,5) соответсвующий расчет разумеется.. ну а main просто для теста.. ну и для наглядности выложу тут :
Это сообщение отредактировал(а) mes - 10.11.2010, 20:54 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
тогда диспетчер калькулятора будет выглядить так :
Добавлено @ 20:40 или для вашего стиля (с динамик кастом )
P.S. если auto не поддерживается, значит вместо него соответсвующий тип.. оба варианта практически равноправны.. первый чуточку быстрей, а с динамик_кастом чуточку проще.. выбирайте на свой вкус.. если что то осталось непонятное, могу объяснить Это сообщение отредактировал(а) mes - 10.11.2010, 20:53 |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
ребят, тут поглядите
|
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
ну так вы уже который день обсуждаете именно реализацию мультиметодов на конкретном примере
нет тут простых путей. просто и красиво только в самом конце, типа calc(нагрузка, левая опора, правая опора), когда конкретная функция расчета вызывается по конкретным типам нагрузки и опор. и ресурсов таких подробных (русских), увы, нет. реализуется обычно либо при помощи dynamic_cast или visitor универсальных решений тоже нет. я привел ссылку на интересную, на мой взгляд, реализацию |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Вроде бы их мы не обсуждали. Я уже понял, что простых путей нет, но правильно ли я понимаю, что мультиметод имеет смысл использовать в случае если некая функция работает с двумя и более объектами, которые в сигнатуре функции объявлены как указатели на базовый класс? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
у mes спросите))))
необходимо, но не достаточно. мультиметод реализует полиморфизм, основанный на типах более одного аргумента функции. конечно, не каждой функции с несколькими базовыми классами в аргументах это требуется вообще мультиметод это то, чего в С++ нет (и хотя уже лет 7-8 обсуждаются возможные технические и синтаксические пути ввода их в язык, непохоже, что в обозримом будущем они появятся). а раз нет, то можно говорить не об использовании, а моделировании похожего поведения. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
их. точнее упрощенный частный случай, где в качестве одного из типов выступает id.. Добавлено через 3 минуты и 17 секунд т.е. если классический мултиметод имеет условную сигнатуру void mm (virtual a&, virtual b&, virtual b& ); // 3х мерный случай то наша функция имеет void mm (virtual load&, size_t s1, size_t s2 ); // где s1 и s2 условно ассоциированные с типом идентификаторы.. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |