Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запутался с наследованием и полиморфизмом 
:(
    Опции темы
Нитонисе
Дата 2.11.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Есть класс А, у которого имеются потомки класс В и класс C.
Есть также класс D, одна из операций которого выглядит так
Код

void method(B*);
void method(C*);

то есть класс D должен работать с наследниками класса A.
Теперь пишу такой код
Код

A *a = new B;
D d;
d.method(a);

Компилятор ругается на последнюю строчку

Код

[C++ Error] Main.cpp(68): E2285 Could not find a match for 'D::method(A*)'


как мне научить класс D работать с разными потомками класса А?

Это сообщение отредактировал(а) Нитонисе - 2.11.2010, 19:20
PM MAIL   Вверх
baldina
Дата 2.11.2010, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



дело в том, что B и C являются А, но А не является ни B, ни C (Ту134 - самолет, но самолет - не обязательно Ту134)
в чем полиморфизм? в том, что принимая аргументом A* и вызывая виртуальную функцию, будут работать методы B или C, в зависимости от типа.
Цитата

как мне научить класс D работать с разными потомками класса А?

так:
Код

class A {
public:
  virtual void method (void);
};

class B: public A {
public:
  void method (void); // переопределение
};

class C: public A {
public:
  void method (void); // переопределение
};

class D {
 public:
  void method (A*a) { a->method (); // вызывается B::method или C::method
};

A *b = new B;
A *c = new C;
D d;
d.method(b); // вызывается B::method
d.method(c); // вызывается C::method


PM MAIL   Вверх
Нитонисе
Дата 2.11.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



baldina,  так получается что работает метод, реализованный в классах В и С. Это не совсем то, что мне нужно. Мне нужно чтобы работал метод, реализованный в D.

Добавлено @ 19:45
То есть изначально метод класса D не знает какой именно потомок класса А будет его аргументом. Действует позднее связывание, тип аргумента определяется по факту переданного в метод указателя.

Это сообщение отредактировал(а) Нитонисе - 2.11.2010, 19:46
PM MAIL   Вверх
Artemon
Дата 2.11.2010, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Цитата

Мне нужно чтобы работал метод, реализованный в D


Класс D вообще никак не участвует в наследовании, поэтому требование просто не корректное.

Цитата

То есть изначально метод класса D не знает какой именно потомок класса А будет его аргументом. Действует позднее связывание, тип аргумента определяется по факту переданного в метод указателя.


Пример который тебе показали, на 100% соответствует этому


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Нитонисе
Дата 2.11.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(Artemon @  2.11.2010,  20:09 Найти цитируемый пост)
Пример который тебе показали, на 100% соответствует этому

Пример-то верный, только он немного не в тему. Мне надо чтобы метод D::method(A*) работал с собственными данными класса D, а по типу своего аргумента определял как именно с ними нужно работать. 
Я так понял у меня изначально постановка задачи неверная. Нужно сделать по примеру, который расписал baldina, а в реализации метода D::method(A*) выполнять проверку типа аргумента. Если указатель на B - то один набор операций, если это указатель на С - второй набор операций.
PM MAIL   Вверх
Artemon
Дата 2.11.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Не очень хорошая идея делать проверки. Зачем вам тогда полиморфизм ?
Вам нужно чтобы все производные классы (в вашем случае A и B) умели возвращать данные через одинаковые методы, тогда вы сможете сделать следующее (немного переделал пример для понятности):

Код

class InterfaceA {
public:
  virtual int GetData (void) = 0;
};

class B: public InterfaceA {
public:
  int GetData (void) {return 1;}
};

class C: public InterfaceA {
public:
  int GetData (void) {return 2;}
};

class D {
 public:
  void method (A*a) 
       { 
       DoAction(a->GetData());
       }

  protected:
         void DoAction(int a)
             {
              int c = 10 + a;
             }
};

A *b = new B;
A *c = new C;
D d;
d.method(b); // вызывается B::method
d.method(c); // вызывается C::method



Это сообщение отредактировал(а) Artemon - 2.11.2010, 20:58


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Нитонисе
Дата 2.11.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(Artemon @  2.11.2010,  20:57 Найти цитируемый пост)
Не очень хорошая идея делать проверки. Зачем вам тогда полиморфизм ?Вам нужно чтобы все производные классы (в вашем случае A и B) умели возвращать данные через одинаковые методы, тогда вы сможете сделать следующее (немного переделал пример для понятности)

Не, тут дело в том, что проблемы вызвать нужную функцию из семейства А,В,С нет. Есть проблема правильно выполнить метод D::(A*). То есть в зависимости от того, какой фактический указатель передается в метод, я выполняю разные операции.
Код

class A 
{
};

class B: public A 
{
};

class C: public A 
{
};

class D 
{
 public:
  void method (A*a) 
       { 
            if (B *a = dynamic_cast<B*>(a))
                data += 1;
            if (C *c = dynamic_cast<C*>(a))
                data += 2;
       }

  protected:
    int data;     
};

A *b = new B;
A *c = new C;
D d;
d.method(b); // прибавляется 1
d.method(c); // прибавляется 2

PM MAIL   Вверх
Artemon
Дата 3.11.2010, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL   Вверх
Нитонисе
Дата 3.11.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(Artemon @  3.11.2010,  08:37 Найти цитируемый пост)
Зачем тогда вообще нужны классы A и B

Я пример упростил, но в реальной программе из потомков класса А берутся некоторые данные при выполнении D::method(A*).
PM MAIL   Вверх
Artemon
Дата 3.11.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Цитата

Я пример упростил, но в реальной программе из потомков класса А берутся некоторые данные при выполнении D::method(A*).


Все уже сказано выше, лично мне добавить нечего.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
mes
Дата 3.11.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Artemon @  3.11.2010,  09:28 Найти цитируемый пост)
Все уже сказано выше, лично мне добавить нечего. 

не все smile  (хотя пример с GetData очень близок по сути к отсутствующему)

http://liveworkspace.org/code/ca23ab383de6...54a82098539f3d6

Это сообщение отредактировал(а) mes - 3.11.2010, 10:51


--------------------
PM MAIL WWW   Вверх
baldina
Дата 3.11.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



mes, пример хороший и правильный. к сожалению, он вряд ли поможет ТС, а может и навредит, потому что 
Код

class D {
void method(B*);
void method(C*);
};
 
где B и C имеют общего предка, скорее всего следствие ошибок проектирования.
те редкие случаи, когда это действительно нужно, возникают на более высоком уровне абстракции, когда про полиморфизм в С++ ясно все и понятны его недостатки.
если я неправ, хотелось бы не технический, а жизненный пример smile
 smile из жизни самолетов  smile 
PM MAIL   Вверх
xvr
Дата 3.11.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Перенесите разные части того, что нужно исполнять в классе D в классы B и C (в виде виртуальной функции, описанной в классе A), и вызывайте ее из D::method(A*)


PM MAIL   Вверх
Нитонисе
Дата 3.11.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  3.11.2010,  11:55 Найти цитируемый пост)
Перенесите разные части того, что нужно исполнять в классе D в классы B и C (в виде виртуальной функции, описанной в классе A), и вызывайте ее из D::method(A*)

Это было бы неудобно, так как метод соотносится с классом D и работает с его данными. Работать данными метода D в классах В и С - как-то не корректно.
PM MAIL   Вверх
xvr
Дата 3.11.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  3.11.2010,  11:59 Найти цитируемый пост)
Это было бы неудобно,
Тогда штудируйте различный паттерны, что вам больше подойдет. Начать можно с Visitor и MultiMethod

PM MAIL   Вверх
baldina
Дата 3.11.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата

метод соотносится с классом D и работает с его данными

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

Добавлено через 1 минуту и 52 секунды
я бы даже усилил: B и C связаны с D. при этом A не связан с D? или связан с чем-то более общим, чем D, но это не отражено в проекте?
PM MAIL   Вверх
Нитонисе
Дата 3.11.2010, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



baldina, возможно архитектура классов у меня и не оптимальная, надо подумать, но интересовала именно техническая реализация моей задумки (пусть и не лучшей).

Что касается задачи - D производит некоторые вычисления, для которого требуются различные потомки А. При чем от конкретного типа потомка зависит алгоритм вычислений, при это из этих самых потомков А берутся некоторые данные. Результаты вычисления хранятс в D.

Пока реализовал все это через проверку типов, по аналогии с последним вариантом, что тут выкладывал.. ну а дальше посмотрю, может что-то более дельное в голову придет)
PM MAIL   Вверх
mes
Дата 3.11.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  3.11.2010,  14:22 Найти цитируемый пост)
возможно архитектура классов у меня и не оптимальная,

ну тогда может поделитесь задачей, а не условными классами А,Б,Ц,Д.. ?
может кто подскажет что в таком случае подойдет.. 





--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 3.11.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  3.11.2010,  15:25 Найти цитируемый пост)
ну тогда может поделитесь задачей, а не условными классами А,Б,Ц,Д.. ?может кто подскажет что в таком случае подойдет.. 

Задача техническая.
Цель - расчет балки - определение в ней внутренних усилий от нагрузки.
Класс А - это класс Нагрузка.
Классы В и С - это производные от класса Нагрузка - ТочечнаяНагрузка и ЛинейнаяНагрузка.
Класс D - это, собственно балка.
Таким образом запись Балка::РасчитатьУсилия(Нагрузка*) - вычисляет усилия в балке от аргумента. Причем в зависимости от конкретного типа аргумента (ТочечнаяНагрузка или ЛинейнаяНагрузка) выбирается свой алгоритм. В расчетах фигурируют такие параметры как ДлинаБалки (принадлежит классу Балки), а также ЗначениеНагрузки и ПоложениеНагрузкиНаБалке (это данные принадлежат семейству классво Нагрузка).
PM MAIL   Вверх
mes
Дата 3.11.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



помимо расчета нагрузки балка что еще умеет ? 



--------------------
PM MAIL WWW   Вверх
xvr
Дата 3.11.2010, 17:03 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  3.11.2010,  16:09 Найти цитируемый пост)
Задача техническая.
Классическая задача на multimethod (или double dispatch). См. http://en.wikipedia.org/wiki/Multiple_dispatch http://en.wikipedia.org/wiki/Double_dispatch

NB. Это конечно в том случае, если и Балка и Нагрузка по отдельности еще что то умеют


Это сообщение отредактировал(а) xvr - 3.11.2010, 17:04
PM MAIL   Вверх
baldina
Дата 3.11.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата

задача на multimethod

вариант mes как раз на подпорки из-за отсутствия мультиметодов в С++ или поддержки аспектно-ориентированного подхода
PM MAIL   Вверх
Нитонисе
Дата 3.11.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  3.11.2010,  16:41 Найти цитируемый пост)
помимо расчета нагрузки балка что еще умеет ?

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

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

Добавлено через 34 секунды
Цитата(xvr @  3.11.2010,  17:03 Найти цитируемый пост)
Классическая задача на multimethod (или double dispatch)

Ох с инглишом туго  smile 
PM MAIL   Вверх
baldina
Дата 3.11.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



но таки ругань в сторону ТС была неоправдана, каюсь. double dispatch нужен, так что visitor в помощь

Добавлено через 3 минуты и 40 секунд
multimethod это множественный полиморфизм, когда функция для вызова определяется не по одному типу, а по нескольким типам аргументов:
типа
Код

class shape {};
class rectangle : public shape {};
class circle : public shape {};

virtual intersect (shape&, shape&) = 0;

intersect (rectangle&, rectangle&) {}
intersect (rectangle&, circle&) {}
intersect (circle&, circle&) {}

C++ не поддерживает, для  реализации используются подпорки типа visitor

Добавлено через 6 минут и 54 секунды
а у Нитонисе вероятно это
Код

virtual calc_stress (Элемент&, Нагрузка&) = 0;
calc_stress (Балка, ТочечнаяНагрузка) {}
calc_stress (Балка, ЛинейнаяНагрузка) {}


Добавлено через 10 минут и 11 секунд
если от теории к практике, то скорее всего типов элементов может быть много, заранее неизвестно каких, а типы нагрузок известны заранее, так что может быть самое разумное их просто захардкодить в виде отдельных функций для каждого элемента.
PM MAIL   Вверх
Нитонисе
Дата 3.11.2010, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(baldina @  3.11.2010,  17:37 Найти цитируемый пост)
если от теории к практике, то скорее всего типов элементов может быть много, заранее неизвестно каких, а типы нагрузок известны заранее, так что может быть самое разумное их просто захардкодить в виде отдельных функций для каждого элемента.

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

class Beam  // балка
{
  public:
    calculate(LinearLoad *load) {M = length*load->getValue();} // операция показана условно, LinearLoad - линейная нагрузка
    calculate(DotLoad *load) {M = length/load->getValue();}     // операция показана условно, DotLoad - точечная нагрузка

  protected:
    float length;
    float M;
}

И в программе использовать так
Код

Load *linLoad = new Load;  // Load - базовый класс для LinearLoad и DotLoad
Load *dotLoad = new Load;
Beam beam;
beam.calculate(linLoad);   // по типу аргумента определяем какой именно calculate() задействовать
beam.calculate(dotLoad);


Но как выяснилось это не работает и теперь я делаю так
Код

class Beam  // балка
{
  public:
    calculate(Load *load) 
       { 
            if (LinearLoad *ll = dynamic_cast<LinearLoad*>(load))
                M = length*ll->getValue();
            if (DotLoad *dl = dynamic_cast<DotLoad*>(load))
                M = length*dl->getValue();
       }

  protected:
    float length;
    float M;
}

Вобщем-то в любом случае, если у меня добавится новый тип нагрузки мне пришлось бы либо объявлять еще один метод  calculate(), где в качестве аргумента была бы новая нагрузка. И соответственно новый алгоритм расчета прописывать.
Либо в проверку типов (как по второму варианту) включать проверку на новый тип нагрузки и прописывать свой алгоритм.

Это сообщение отредактировал(а) Нитонисе - 3.11.2010, 18:14
PM MAIL   Вверх
mes
Дата 3.11.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



а в чем отличие точечной нагрузки от линейной ?

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

 и еще, что является наследником балки ?


Это сообщение отредактировал(а) mes - 3.11.2010, 18:39


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 3.11.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  3.11.2010,  18:35 Найти цитируемый пост)
а в чем отличие точечной нагрузки от линейной ?

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


Цитата(mes @  3.11.2010,  18:35 Найти цитируемый пост)
и вопрос.. библиотека будет логически полной ? или предполагается дать возможность пользователю определять новые сущности ?

Имеется ввиду новые типы нагрузок? Пользователь такой возможности иметь не будет, а я, как разработчик, могу добавить новые типы.


Цитата(mes @  3.11.2010,  18:35 Найти цитируемый пост)
 и еще, что является наследником балки ?

На самом деле тут я немного тоже упростил. Любая балка имеет две опоры. Опоры могут быть различные - шарнир, жесткая опора или свободный край (консоль). Так вот наследники Балки - это разные типы с точки зрения опирания. То есть есть такие классы БалкаШарнирШарнир (две шарнирные опоры), БалкаШарнирЖесткая (слева шарнир, справа жесткая опора) и т.д. У каждого типа балки внутренния усилия от одной и той же нагрузки определяются по разному.
PM MAIL   Вверх
baldina
Дата 3.11.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



потом окажется, что балки могут иметь разные сечения, потом - учитывать податливость опор...
классификация обширная)))
PM MAIL   Вверх
Нитонисе
Дата 3.11.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(baldina @  3.11.2010,  19:12 Найти цитируемый пост)
потом окажется, что балки могут иметь разные сечения, потом - учитывать податливость опор...классификация обширная)))

Это намек, что виды опор можно было сделать свойствами класса Балка, а не плодить потомков?) Может и так, но тут дело в том, что это мой первый проект, где я решил опробовать объектный-ориентированный подход, поэтому где-то обоснованность принятия того или иного решения не важна, а важно практическое знакомство с особенностями ООП - наследованием и полиморфизмом.

У меня кстати, в контексте этого объектно ориентированного подхода есть один вопрос. Есть класс А, который является частью В, а В является частью С, который в свою очередь является частью D. то есть такая последовательная вложенность. А есть внешний класс Е, которому часто требуется обращаться к параметрам и А, и В, и С, и D, но логично установить связь всего лишь с верхним классом - D. И теперь получается, что если мне надо получить некоторые данные класса А, выполняя операцию Е, то появляется такая цепочка:
Код

E::method(D* d)
  {
      d->getC()->getB()->getA()->getSomeData();
  } 

Что-то как-то это коряво выглядит.

Это сообщение отредактировал(а) Нитонисе - 3.11.2010, 19:31
PM MAIL   Вверх
xvr
Дата 3.11.2010, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  3.11.2010,  19:30 Найти цитируемый пост)
Может и так, но тут дело в том, что это мой первый проект, где я решил опробовать объектный-ориентированный подход, 
Ох, не ту вы задачу выбрали для первого проекта  smile 
Цитата

поэтому где-то обоснованность принятия того или иного решения не важна, а важно практическое знакомство с особенностями ООП - наследованием и полиморфизмом.
То, что вы хотите, выходит за рамки ООП, как оно реализовано в С++. 

В вашем случае функции расчета нагрузки не должны быть членами класса 'Балка'. Равно как и членами класса 'Нагрузка'. Это должны быть вообще отдельные сущности, выбираемые по сочетанию динамических типов 'Балка/Нагрузка'

Цитата(Нитонисе @  3.11.2010,  19:30 Найти цитируемый пост)
сть класс А, который является частью В, а В является частью С, который в свою очередь является частью D.
Это наследование (как одна из возможных реализаций)
Цитата(Нитонисе @  3.11.2010,  19:30 Найти цитируемый пост)
Код

d->getC()->getB()->getA()->getSomeData();
А это динамическое агрегирование (как одна из возможных реализаций). Вы уж определитесь, что у вас 'есть'


PM MAIL   Вверх
Нитонисе
Дата 3.11.2010, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  3.11.2010,  19:47 Найти цитируемый пост)
Ох, не ту вы задачу выбрали для первого проекта

Ну на простом проекте ООП впринципе не нужен)

Цитата(xvr @  3.11.2010,  19:47 Найти цитируемый пост)
В вашем случае функции расчета нагрузки не должны быть членами класса 'Балка'. Равно как и членами класса 'Нагрузка'. Это должны быть вообще отдельные сущности, выбираемые по сочетанию динамических типов 'Балка/Нагрузка'

То есть функция принимает в качестве аргументов объект нагрузки, объект балки и возвращает некий результат? Ну это как вариант... врядли тут могут быть единственно правильные решения. Или вы попробуете обосновать почему именно ваш вариант наиболее предпочтителен?

Цитата(xvr @  3.11.2010,  19:47 Найти цитируемый пост)
Вы уж определитесь, что у вас 'есть'

Я привел другую ситуацию. Это уже не о расчете балок. Классы от А до D вложены один в один как матрешки. А есть класс Е, которому нередко нужны данные из каждого из этих матрешек. Мне кажется с таким подходом будут слишком велики накладные расходы по вызову функций возвращающих объект с более низкого уровня (начиная от D и до А).
PM MAIL   Вверх
mes
Дата 3.11.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  3.11.2010,  18:59 Найти цитируемый пост)
Ну на простом проекте ООП впринципе не нужен)

да и на сложном проекте.. не всегда нужно "сырой" ООП пихать всюду...

под "сырым ООП" я подразумеваю попытка реализовать ООП средствами языка, нежели проектированием..
понятнее описать не могу.. это надо почувствовать.. вобщем не всегда стоит решать задачу в лоб..

Добавлено через 6 минут и 37 секунд
исходя истого что написали:
1. задача по расчету нагрузки на балку вместо двух имеет три компонента,
а именно: балка, нагрузка, и площадь соприкосновения

2. наследование от балки, мягко скатать, неэстетичное и стоит отказаться в пользу агрегации

3. функции расчета нагрузки, как уже сказали выше, не относятся к балке...

итого в той  части задачи, которую Вы описали,  полиморфизм притянут за уши,  и никакой выгоды вы от него не получите..

Добавлено через 9 минут и 16 секунд
Цитата(Нитонисе @  3.11.2010,  18:59 Найти цитируемый пост)
. Или вы попробуете обосновать почему именно ваш вариант наиболее предпочтителен?

потому, что балка вместе с нагрузкой не обладает достаточными знаниями для решения этого вопроса..

Добавлено через 10 минут и 53 секунды
и вобще старайтесь не втягивать зависимости внутрь классов.. чем меньше тем легче поддерживать и развивать проект.. 
smile


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 3.11.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
да и на сложном проекте.. не всегда нужно "сырой" ООП пихать всюду...под "сырым ООП" я подразумеваю попытка реализовать ООП средствами языка, нежели проектированием..понятнее описать не могу.. это надо почувствовать.. вобщем не всегда стоит решать задачу в лоб..

Так ООП более предпочтительно структурного программирования. Во всяком случае область применения ООП выше. Мой нынешний проект вполне годится для опробирования ООП. Есть действующий аналог со структурным походом, хочу переписать его в объектный.

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
а именно: балка, нагрузка, и площадь соприкосновения

И что должно быть в площади соприкосновения?

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
 наследование от балки, мягко скатать, неэстетичное и стоит отказаться в пользу агрегации

В чем будет агрегация? Есть балка, у балки могут быть три типа опор с каждой стороны. Можно типы опор впринципе прописать как свойства балки... но чем это лучше?

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
3. функции расчета нагрузки, как уже сказали выше, не относятся к балке...

Что ж это тогда будет - просто свободная функция?


Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
итого в той  части задачи, которую Вы описали,  полиморфизм притянут за уши,  и никакой выгоды вы от него не получите..

Не спорю, что он тут реализован неэффективно, но надо хоть почувствовать на своих родных объектах как он работает и в каких случаях какие функции вызываются))

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
потому, что балка вместе с нагрузкой не обладает достаточными знаниями для решения этого вопроса..

Как же не обладает? Обладает. Достаточно данных нагрузки и балки чтобы определить внутренние усилия.

Цитата(mes @  3.11.2010,  22:12 Найти цитируемый пост)
и вобще старайтесь не втягивать зависимости внутрь классов.. чем меньше тем легче поддерживать и развивать проект.. 

То есть? Стараться не передавать методам объекта в качестве аргументов других объектов и не содержать в качестве данных класса ссылки и указатели на др. объекты?
PM MAIL   Вверх
mes
Дата 3.11.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Так ООП более предпочтительно структурного программирования. 

ООП бывает разное.. ООП - как подерживаемая компилятором парадигма.. ее надо принять там где нужно.. и не злоупотрблять.. и ООП (точнее ООА объектно ориентированный анализ) как способ группировки знаний - тут стоит уделить побольше внимания..

Добавлено через 1 минуту и 7 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
. Мой нынешний проект вполне годится для опробирования ООП.

Я Вас не отгавариваю от ООП, а говорю что не все ее достижения стоит запихивать в одну корзину.. кстати этим вы убиваете ООП как подход...

Добавлено через 2 минуты и 14 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Есть действующий аналог со структурным походом, хочу переписать его в объектный.

наличие кучи наследований не достаточно для установления объктного подхода..

Добавлено через 3 минуты и 42 секунды
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
И что должно быть в площади соприкосновения?

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

Добавлено через 5 минут и 19 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
В чем будет агрегация? Есть балка, у балки могут быть три типа опор с каждой стороны. Можно типы опор впринципе прописать как свойства балки... но чем это лучше?

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

Добавлено через 6 минут и 45 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Что ж это тогда будет - просто свободная функция?

если не зависит от какого то мира знаний, то просто свободная функция..  и не бойтесь что это ведет удаляет от ООП, наоборот Вы начинаете использовать его силу..

Добавлено через 8 минут и 17 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Не спорю, что он тут реализован неэффективно, но надо хоть почувствовать на своих родных объектах как он работает и в каких случаях какие функции вызываются))

неэффективно, это лишь малая доля проблемы.. намного большая проблема - не логично..

Добавлено через 9 минут и 30 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
Как же не обладает? Обладает. Достаточно данных нагрузки и балки чтобы определить внутренние усилия.

Это в вашем ограниченом варианте достаточно.. а если подумать далеко не так все одназначно..
или весы и на земле и на луне  показывают одно и то же ?

Добавлено через 10 минут и 59 секунд
Цитата(Нитонисе @  3.11.2010,  21:35 Найти цитируемый пост)
То есть? Стараться не передавать методам объекта в качестве аргументов других объектов и не содержать в качестве данных класса ссылки и указатели на др. объекты? 

нет.. стараться не вносить детали и знания, которые объекту не необходимы.. 




--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  3.11.2010,  22:52 Найти цитируемый пост)
если балка двухмерная, то длина соприкосновения.. т.е отрезок балки на который воздействуют.. достаточно малый отрезок есть точка..

И зачем такие сложности? Почему нельзя вычислять усилия в объекте Балка с аргументом Нагрузка?
Цитата(mes @  3.11.2010,  22:52 Найти цитируемый пост)
ну так смотрите что написали жирным, так и записывайте в программный код, и не нагружайте логику ни себе, ни другим.

Это значит такой код?
Код

class Балка
{
  protected:
    ТипОпоры леваяОпора;
    ТипОпоры праваяОпора;
};

Цитата(mes @  3.11.2010,  22:52 Найти цитируемый пост)
если не зависит от какого то мира знаний, то просто свободная функция..  и не бойтесь что это ведет удаляет от ООП, наоборот Вы начинаете использовать его силу..

С таким подходом отдельными функциями можно реализовать практически ВСЁ. Будет одна программа, вызывающая другие подпрограммы, которые вызывает более мелкие подпрограммы. Это не ООП, а структурный подход.
PM MAIL   Вверх
mes
Дата 4.11.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  09:21 Найти цитируемый пост)
С таким подходом отдельными функциями можно реализовать практически ВСЁ. Будет одна программа, вызывающая другие подпрограммы, которые вызывает более мелкие подпрограммы. 

хм.. т.е. из крайности в крайность ?

Цитата
Это не ООП, а структурный подход. 

а ООП и есть структурный подход  smile

Добавлено через 6 минут и 37 секунд
Цитата(Нитонисе @  4.11.2010,  09:21 Найти цитируемый пост)
Почему нельзя вычислять усилия в объекте Балка с аргументом Нагрузка?

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

А вот стоит ли группировать расчет нагрузок в класс или нет - зависит от реализации..



--------------------
PM MAIL WWW   Вверх
xvr
Дата 4.11.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Один из принципов ООП (в С++) - инкапсуляция. Это в частности означает, что все операции класса (т.е. операции, использующие и влияющие на состояние класса) должны быть описаны ВНУТРИ класса. Возьмем операцию 'Расчет нагрузки на балку'. Она ни может быть описана ОДНИМ классом (ни Балкой ни Нагрузкой). Она полностью (в том числе и алгоритмически) зависит от обоих этих классов. А это означает, что в рамках ООП в С++ она НЕ МОЖЕТ быть членом ни одного из этих классов.
А это в свою очередь означает, что НЕ НАДО притягивать сюда за уши ООП механизмы С++, нужно строить НОВЫЙ механизм, используя возможности С++

Цитата(Нитонисе @  3.11.2010,  22:35 Найти цитируемый пост)
Что ж это тогда будет - просто свободная функция?
Вы смотрели ссылки, что я давал? Там расписано (в том числе с примерами на С++) как это делать.
Еще поищите в сети 'Паттерны программирования' (как то так называется). Должна быть информация и на русском.

И еще совет - прежде чем углубляться в дебри паттернов и пр. изучите как следует обычное ООП (в рамках С++). Иначе вы не углубитесь, а утоните  smile 

Цитата(Нитонисе @  3.11.2010,  19:59 Найти цитируемый пост)
Классы от А до D вложены один в один как матрешки. А есть класс Е, которому нередко нужны данные из каждого из этих матрешек. Мне кажется с таким подходом будут слишком велики накладные расходы по вызову функций возвращающих объект с более низкого уровня (начиная от D и до А). 
Вот, замечательный пример на непонимание основ (или на неумение сформулировать задачу)  smile 

Код

class A {
..

void fa();
};

class B : public A {
...

void fb();
};

class C : public B {
...

void fc();
};

class D : public C {
...
void fd();
};


D d;

d.fa();
d.fb();
d.fc();
d.fd();


PM MAIL   Вверх
Нитонисе
Дата 4.11.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  4.11.2010,  11:48 Найти цитируемый пост)
Возьмем операцию 'Расчет нагрузки на балку'. Она ни может быть описана ОДНИМ классом (ни Балкой ни Нагрузкой). Она полностью (в том числе и алгоритмически) зависит от обоих этих классов. А это означает, что в рамках ООП в С++ она НЕ МОЖЕТ быть членом ни одного из этих классов.

И что ж тогда? Объявить нагрузку атрибутом класса балка? Тогда классу всего хватит, чтобы вычислить усилия в балке от нагрузки. 
Мне представляется ООП - это куча различных объектов каким-то образом взаимодействующих друг с другом. Причем взаимодействие должно быть обязательно, иначе система попросту не будет работать. Это все равно что поставить в кузов от машины мотор, но не соединить его с ведущей осью - машина никуда не уедет.
В контексте моего проекта есть объект нагрузка и есть объект балка. Одно не являются частью другого, они могут существовать независимо друг от друга. При этом нужно уметь посчитать усилия в балке от этой нагрузки. Усилия ведь без нагрузки быть не могут. Значит все слепить в один класс? Но тогда придется все объединять и объединять до тех пор, пока не получится куча различных параметров, характеризующих систему и к этой куче обращается куча подпрограмм, оперирующих ими. Это не ООП, а структурный (алгоритмический подход).

Добавлено через 1 минуту и 31 секунду
Цитата(xvr @  4.11.2010,  11:48 Найти цитируемый пост)
Вот, замечательный пример на непонимание основ (или на неумение сформулировать задачу)

Перейдем к более конкретным абстракциям. Есть спица, спица часть обода, обод часть колеса, колесо часть шасси. Предлагаете все эти объекты объявить наследниками друг друга?
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
И что ж тогда? Объявить нагрузку атрибутом класса балка? 

вам уже говорили, ничего лишнего, что не отражает действительно состояние балки.. 
smile

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
Мне представляется ООП - это куча различных объектов каким-то образом взаимодействующих друг с другом. 

не совсем правильное представление.. этого не достаточно чтоб называться ООП..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
 Причем взаимодействие должно быть обязательно,

а не думаете ли Вы что взаимодействие это отдельная сущность ? а вот что это класс или функция , надо смотреть по требованиям..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
Это все равно что поставить в кузов от машины мотор, но не соединить его с ведущей осью

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

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
Значит все слепить в один класс

Вам как раз обратное советуют..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
 Это не ООП, а структурный (алгоритмический подход).

то что Вы описали не структурный подход, а куча хлама..

Цитата(Нитонисе @  4.11.2010,  11:24 Найти цитируемый пост)
 Есть спица, спица часть обода, обод часть колеса, колесо часть шасси. Предлагаете все эти объекты объявить наследниками друг друга?

ни за что smile
кстати покажите цитату после которой Вы сделали такие далеко идущие планы..

Это сообщение отредактировал(а) mes - 4.11.2010, 14:11


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  14:04 Найти цитируемый пост)
вам уже говорили, ничего лишнего, что не отражает действительно состояние балки.. 

В контексте моей задачи состояние балки характеризуется только длиной пролета и типами опор.
Состояние нагрузки характеризуется ее величиной и положением на некоей абстрактной балке.
Мне нужно определить внутренние усилия в балке от нагрузки. Каким образом это делать? Помним о том, что другие объекты могут спросить у балки - "А какие у тебя внутренние усилия от этой нагрузки?".
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  13:11 Найти цитируемый пост)
В контексте моей задачи состояние балки характеризуется только длиной пролета и типами опор.
Состояние нагрузки характеризуется ее величиной и положением на некоей абстрактной балке.
Мне нужно определить внутренние усилия в балке от нагрузки. Каким образом это делать? Помним о том, что другие объекты могут спросить у балки - "А какие у тебя внутренние усилия от этой нагрузки?". 

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

и так у нас есть основные сущности
Код

struct beam    {};        
struct support {};
struct load    {};
struct stress  {};


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

вот условный набросок :
Код

struct simple_construction 
{
     beam Beam;
     support Support[2];
     load Load;
   
     bool is_valid () ;
     stress calc_stress ();
};


Это сообщение отредактировал(а) mes - 4.11.2010, 14:48


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  14:16 Найти цитируемый пост)
теперь нам нужно построить из них конструкциюв котором можете размещать балку, опоры, и нагрузку ( делать это в зависимости от разнообразия конструкций, можно как динамически, так и статически) и у нее же опрашивать усилие..

То есть надо создавать объект класса БалкаПодНагрузкой, атрибутами которой будут один экземпляр Балки и вектор экземпляров Нагрузка?
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  13:30 Найти цитируемый пост)
То есть надо создавать объект класса БалкаПодНагрузкой, атрибутами которой будут один экземпляр Балки и вектор экземпляров Нагрузка? 

не совсем так.. там ниже приведен пример.. 



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  14:32 Найти цитируемый пост)
не совсем так.. там ниже приведен пример.. 

Где хранить результат расчета? Нагрузок может быть много.

Почему вы все объявляете структурами?
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  13:38 Найти цитируемый пост)
Почему вы все объявляете структурами? 

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

Добавлено через 1 минуту и 35 секунд
Цитата(Нитонисе @  4.11.2010,  13:38 Найти цитируемый пост)
Где хранить результат расчета? Нагрузок может быть много.

сделайте конструкцию в которую можно добавить не одну нагрузку..

если я правильно понял ваш вопрос.. 




--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Впринципе ваша структура близка к моему классу Балка, в чем разница-то?
Код

class BeamHingeHinge : public Beam
{
  public:
    void calcMOneLoad(Load *load, float &m1, float &m2); // функция вычисляет значения внутренних усилий (моментов) на опорах от одной нагрузки
    void calcMAllLoad(); // устанавливает значения М1 и М2

  protected:
    float Beam::length;
    float Beam::M1;  // момент на левой опоре
    float Beam::M2;  // момент на правой опоре
    vector<Load> Beam::loads; // совокупность нагрузок
};

Это класс одного из потомков балки с шарнирными опорами слева и справа. Метод calcMOneLoad - перегружен, в базовом классе он объявлен виртуальным. В зависимости от типа нагрузки Load производится определенный расчет моментов. Причем если бы балка была например класса BeamHingeRigid (слева шарнир, справа жесткая заделка), то метод calcMOneLoad считал бы уже совсем по другому.

А как в вашем примере бышел расчет? Нужно было бы постоянно опрашивать свойство support, чтобы определять тип расчета и плюс к этому опрашивать тип нагрузка Load, чтобы еще одну развилку делать... получится очень ветвистая функция.
PM MAIL   Вверх
mes
Дата 4.11.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



кстати можно сделать конструкцию, состоящую из других конструкций..

Добавлено @ 14:54
Цитата(Нитонисе @  4.11.2010,  13:52 Найти цитируемый пост)
Впринципе ваша структура близка к моему классу Балка, в чем разница-то?

а Вы попробуйте написать в этом стиле , и увидите  smile

Добавлено @ 14:56
во первых Вам не нужно будет жестко наследоваться от балки, ради балки с двумя опорами - этого уже достаточно..

Добавлено @ 14:57
Цитата(Нитонисе @  4.11.2010,  13:52 Найти цитируемый пост)
 Нужно было бы постоянно опрашивать свойство support, чтобы определять тип расчета и плюс к этому опрашивать тип нагрузка Load, 

если сделать структурой то да.. если классом (т.е. убрать состояние в приват) то только при изменении составляющих.. 
smile

Добавлено через 6 минут и 10 секунд
Цитата(Нитонисе @  4.11.2010,  13:52 Найти цитируемый пост)
 чтобы еще одну развилку делать... получится очень ветвистая функция. 

а чтоб не делать развилок, для этого тоже есть решения smile


Это сообщение отредактировал(а) mes - 4.11.2010, 14:57


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



mes, дело в том, что я больше знаком с предметной областью и мои решения происходят именно от этого знакомства. Сюда я выкладываю только небольшую толику темы, так как он специфична и многим будет попросту непонятна. Ведь те описания объектов и те связи, которые я тут показал - далеко не полны. Их будет много больше, равно как и объектов будет тоже намного больше.

Если интересно, могу полностью описать систему.
Необходимо рассчитать многопролетную балку методом перемещений. Есть некий графический интерфейс, который позволяет задавать новые пролеты, редактировать их, задавать типы опор. Есть графический интерфейс, регулирующий нагрузки, там можно задать тип нагрузки и ее характеристики. При этом нагрузки задаются в контексте уже заданных пролетов, то есть если нагрузка выходит за пределы пролета, то она попросту не добавляется. Нагрузки так же можно группировать в комбинации посредством еще одного графического интерфейса. То есть можно рассматривать балку нагруженную разными сочетаниями нагрузок. Вся эта расчетная схема сразу же после получения данных или их корректировки отображается в графическом окне на канве компонента TImage. Если балка статически неопределима - производится ее расчет методом перемещений. Этому методу нужно работать со всеми данными по балке (с пролетами и с нагрузками). После решения балки методом перемещений можно определить внутренние усилия в сечениях балки (в каждом ее пролете) с заданным интервалом. Наборы усилий должны сохраняться, так как их будут запрашивать другие объекты (например подбор металлической балки). После решения балки результаты немедленно должны отрисовыватьс в графическом окне в виде эпюр (график распределения внутренних усилий по длине балки).

Задачу необходимо решить таким обьразом, чтобы было затем удобно осуществлять сопровождение программы, модифицировать ее, расширять функционал. Так же нужно разработать объекты, которые было бы возможно применять в других программах. Например простая однопролетная балка. Если мне в другой программе понадобится считать такую балку, я хочу чтобы у меня было уже готовое решение - балка, которая умеет в самой себе определять усилия от заданной нагрузки. Так же отдельно и независимо должен быть реализован метод перемещений. Я могу захотеть решать балку другим методом (например метод сил) и нужно чтобы он легко интегрировался в общую структуру, без существенных изменений. 
PM MAIL   Вверх
mes
Дата 4.11.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  14:17 Найти цитируемый пост)
Если интересно, могу полностью описать систему.

все что описали, не совпадает с теми примерами, которые Вы приводили.. 
т.е несмотря на то что есть достаточно полное описание задачи, код не представляет такой же ясной модели..

Добавлено @ 15:32
вот например акак реализована эта подзадача 
Цитата(Нитонисе @  4.11.2010,  14:17 Найти цитируемый пост)
 При этом нагрузки задаются в контексте уже заданных пролетов, то есть если нагрузка выходит за пределы пролета, то она попросту не добавляется

?

Добавлено @ 15:33
Цитата(Нитонисе @  4.11.2010,  14:17 Найти цитируемый пост)
Так же отдельно и независимо должен быть реализован метод перемещений. 

ну вот сами говорите, что должен быть свободной функцией.. smile
или самостоятельным классом..


остальное оставлю без коментариев, так как много букв.. 


Это сообщение отредактировал(а) mes - 4.11.2010, 15:35


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  15:30 Найти цитируемый пост)
т.е несмотря на то что есть достаточно полное описание задачи, код не представляет такой же ясной модели..

Кода пока и нет - я его только разрабатываю.

Цитата(mes @  4.11.2010,  15:30 Найти цитируемый пост)
вот например акак реализована эта подзадача

Нагрузка добавляется в вектор, приписанный (через указатель) к конкретному пролету. Если положение нагрузки выходит за рамки этого пролета - нагрузка не добавляется. Пока не решил к какому объекту определить эту операцию.

Цитата(mes @  4.11.2010,  15:30 Найти цитируемый пост)
ну вот сами говорите, что должен быть свободной функцией.

Да это не то что функция, это целый набор функций. Но это касается метода перемещений, а есть расчет статически определимой балки, он не требует метода перемещений. Вот усилия в статически определимой балке от заданной нагрузки я и хотел вычислять методом класса Балка.


Цитата(mes @  4.11.2010,  15:30 Найти цитируемый пост)
остальное оставлю без коментариев, так как много букв.. 

Вот в том-то и дело, что вы советуете те или иные решения основыаясь на гораздо меньшей информации чем я. Я не говорю, что мои решения супер, но ваши имели бы бОльший вес, если бы вы глуюже вникли в задачу. Понятно, что это трудоемко и вы этим заниматься не станете, потому концептуальные решения нам не обсудить, а вот частности, особенности реализации - вполне.

Вот меня интересует абстрактный пример.
Есть класс Фигура. Частные варианты Фигуры - это Квадрат, Круг, Треугольник. Что лучше - объявить потомков от Фигуры, или создать атрибут ТипФигуры, принимающий одно из трех значений - Круг, Квадрат, Треугольник. Как мне кажется первый вариант лучше, потому что позволяет затем использовать перегруженные функции, например draw(). Ведь во втором варианте в функции дро пришлось бы проверять атрибут ТипФигуры и в завивисимости от него идти по тому или иному пути, то есть цепочка if..else.

Та же история с балками. Опоры у балок могут быть разные. Что лучше - породить потомков с перегруженными функциями расчета усилий или объявить аргумент в класса Балка, указывающий на тип опор... логика та же, что и с фигурами. Возможно отличия базового класса от потомков тут незначительны, но ведь в будщем могут появиться новые существенные отличия, которые я сейчас не могу предположить и тогда модифицировать код было бы намного проще имея структуру потомков и предков, чем заданные атрибуты в одном классе.
PM MAIL   Вверх
mes
Дата 4.11.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  14:45 Найти цитируемый пост)
Вот меня интересует абстрактный пример.
Есть класс Фигура. Частные варианты Фигуры - это Квадрат, Круг, Треугольник. Что лучше - объявить потомков от Фигуры, или создать атрибут ТипФигуры, принимающий одно из трех значений - Круг, Квадрат, Треугольник.

Зависит от задачи, если это к примеру графический редактор, то да, удобнее если наследуются от класса фигура.. 
Цитата

 Как мне кажется первый вариант лучше, потому что позволяет затем использовать перегруженные функции, например draw(). Ведь во втором варианте в функции дро пришлось бы проверять атрибут ТипФигуры и в завивисимости от него идти по тому или иному пути, то есть цепочка if..else.

Есть вариант, когда у класса фигура может не быть своего метода draw..
тогда когда отображение зависит не только от внутреннего состояния..

Добавлено @ 16:08
Цитата(Нитонисе @  4.11.2010,  14:45 Найти цитируемый пост)
Опоры у балок могут быть разные. Что лучше - породить потомков с перегруженными функциями расчета усилий или объявить аргумент в класса Балка, указывающий на тип опор... логика та же, что и с фигурами.

логика не та же... 
чтоб была  таже :

у нас есть фигура_прямоугольник, он может быть с бордюром, может с закругленными краями
может иметь разный цвет.. Будем для каждой композиции атрибутов заводить свой класс ?

Добавлено через 6 минут и 23 секунды
Цитата(Нитонисе @  4.11.2010,  14:45 Найти цитируемый пост)
Возможно отличия базового класса от потомков тут незначительны, но ведь в будщем могут появиться новые существенные отличия, которые я сейчас не могу предположить и тогда модифицировать код было бы намного проще имея структуру потомков и предков, чем заданные атрибуты в одном классе. 

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

Добавлено через 13 минут и 54 секунды
Цитата(Нитонисе @  4.11.2010,  14:45 Найти цитируемый пост)
Нагрузка добавляется в вектор, приписанный (через указатель) к конкретному пролету. Если положение нагрузки выходит за рамки этого пролета - нагрузка не добавляется. Пока не решил к какому объекту определить эту операцию.

т.е все на весу ? а не легче ли сделать класс, который эту логику проведет ? 
smile 

Это сообщение отредактировал(а) mes - 4.11.2010, 16:09


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 4.11.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  4.11.2010,  16:04 Найти цитируемый пост)
у нас есть фигура_прямоугольник, он может быть с бордюром, может с закругленными краямиможет иметь разный цвет.. Будем для каждой композиции атрибутов заводить свой класс ?

Я думаю, что если особенности реализации того же рисования существенно отличаются, то можно наплодить потомков, а если не очень (как например цвет), то можно это задать атрибутом. А вы по какому принципу плодите потомков? Приведите пример.

Цитата(mes @  4.11.2010,  16:04 Найти цитируемый пост)
т.е все на весу ? а не легче ли сделать класс, который эту логику проведет ? 

На каком весу? Я просто еще не решил как это будет реализовано, обозначил пока только задачу. Возможно отдельным классом буду это обрабатывать.
PM MAIL   Вверх
mes
Дата 4.11.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  4.11.2010,  14:45 Найти цитируемый пост)
Вот в том-то и дело, что вы советуете те или иные решения основыаясь на гораздо меньшей информации чем я. Я не говорю, что мои решения супер, но ваши имели бы бОльший вес, если бы вы глуюже вникли в задачу. Понятно, что это трудоемко и вы этим заниматься не станете, потому концептуальные решения нам не обсудить, а вот частности, особенности реализации - вполне.

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

Добавлено через 4 минуты и 27 секунд
Цитата(Нитонисе @  4.11.2010,  15:23 Найти цитируемый пост)
А вы по какому принципу плодите потомков? Приведите пример.

по описанию задачи и в зависимости от требований ей поставленных.. 



--------------------
PM MAIL WWW   Вверх
xvr
Дата 8.11.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @ 4.11.2010,  12:24)
Цитата(xvr @  4.11.2010,  11:48 Найти цитируемый пост)
Возьмем операцию 'Расчет нагрузки на балку'. Она ни может быть описана ОДНИМ классом (ни Балкой ни Нагрузкой). Она полностью (в том числе и алгоритмически) зависит от обоих этих классов. А это означает, что в рамках ООП в С++ она НЕ МОЖЕТ быть членом ни одного из этих классов.

И что ж тогда? Объявить нагрузку атрибутом класса балка? 

Какое слово в предложении 'НЕ МОЖЕТ быть членом ни одного из этих классов' не понятно? Я уже 2 РАЗА давал одни и те же ссылки, вы с ними ознакомились?
Цитата

Мне представляется ООП - это куча различных объектов каким-то образом взаимодействующих друг с другом. 
Точно, вот только их больше, чем вам представляется

Цитата

В контексте моего проекта есть объект нагрузка и есть объект балка. Одно не являются частью другого, они могут существовать независимо друг от друга. При этом нужно уметь посчитать усилия в балке от этой нагрузки. Усилия ведь без нагрузки быть не могут. Значит все слепить в один класс?
 smile Интересные у вас выводы. Я фигею, дорогая редакция.  smile 
У вас должен быть ОТДЕЛЬНЫЙ БАЗОВЫЙ КЛАСС ДЛЯ ПОДСЧЕТА УСИЛИЯ. И их (этих отдельных наследников классов), должно быть столько, сколько существует возможных комбинаций <типов балки>х<тип нагрузки>

Цитата

Перейдем к более конкретным абстракциям. Есть спица, спица часть обода, обод часть колеса, колесо часть шасси. Предлагаете все эти объекты объявить наследниками друг друга?
Я предлагаю разделить мухи от котлет. Ваш пример - это агрегация, а не наследование. Ваш первоначальный вопрос был непонятно о чем (я так понял, что все же о наследовании). Вы уж формулируйте вопросы точнее, что бы потом не оказалось, что он (вопрос) был совсем не о том, и не так и вообще подразумевалось что то совсем противоположное.  smile 


Это сообщение отредактировал(а) xvr - 8.11.2010, 16:01
PM MAIL   Вверх
Нитонисе
Дата 9.11.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  8.11.2010,  15:59 Найти цитируемый пост)
У вас должен быть ОТДЕЛЬНЫЙ БАЗОВЫЙ КЛАСС ДЛЯ ПОДСЧЕТА УСИЛИЯ.

Что же этот класс делает? Считает усилие и все? Функционал сопоставим с единственной функцией, тем более что внутреннее состояние этого класса никому не интересно, кроме самого этого класса. Все вокруг хотят только усилие от этого класса. Проще сделать уже отдельную функцию
Код

float calcM(Балка *балка, Нагрузка *нагрузка);

перегруженную столько раз, сколько у меня сочетаний Балка-Нагрузка (сочетаний всего 18 на сегодняшний день). При этом внутри функции будут постоянно идти обращения к оюъектам Балка и Нагрузка с целью запросить те или иные данные (длина балки, значение нагрузки, точка приложения нагрузки). Представьте, что мне усилие нужно считать в цикле на 100 нагрузок... не велики ли будут накладные расходы с этими вызовами?
Цитата(xvr @  8.11.2010,  15:59 Найти цитируемый пост)
Я предлагаю разделить мухи от котлет. Ваш пример - это агрегация, а не наследование. Ваш первоначальный вопрос был непонятно о чем (я так понял, что все же о наследовании). Вы уж формулируйте вопросы точнее, что бы потом не оказалось, что он (вопрос) был совсем не о том, и не так и вообще подразумевалось что то совсем противоположное. 

Я говорил именно об агрегации, это вы решили обернуть это наследованием. Мне нужно чтобы внешний объект имел хороший (быстрый) доступ ко всем составляющим одного целого - матрешки. Внешний объект должен легко получать данные как из самой большой матрешки, так и из самой маленькой. Так вот если нужно получить данные из самой маленькой - будет та цепочка вызовов, о которой я писал.

Цитата(xvr @  8.11.2010,  15:59 Найти цитируемый пост)
Я уже 2 РАЗА давал одни и те же ссылки, вы с ними ознакомились?

А я писал всего один раз - с английским на "вы"  smile  
PM MAIL   Вверх
xvr
Дата 9.11.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @ 9.11.2010,  15:01)
Цитата(xvr @  8.11.2010,  15:59 Найти цитируемый пост)
У вас должен быть ОТДЕЛЬНЫЙ БАЗОВЫЙ КЛАСС ДЛЯ ПОДСЧЕТА УСИЛИЯ.

Что же этот класс делает? Считает усилие и все? 

Да
Цитата

Функционал сопоставим с единственной функцией, тем более что внутреннее состояние этого класса никому не интересно, кроме самого этого класса.
Да
Цитата

Все вокруг хотят только усилие от этого класса. 
Да

Цитата

Проще сделать уже отдельную функцию
Код

float calcM(Балка *балка, Нагрузка *нагрузка);

перегруженную столько раз, сколько у меня сочетаний Балка-Нагрузка (сочетаний всего 18 на сегодняшний день).
Нет, не проще. Multimethod предполагает динамическое разрешение типа вызываемой функции от типов объектов. Это аналог виртуальных методов, но обобщенный на группу взаимодействующих экземпляров классов. Перегрузка функций не даст run-time полиморфизма. 
Пример:
Код

class BaseA {
public:
 virtual ~BaseA() {}
};

class BaseB {
public:
 virtual ~BaseB() {}
};

class BaseABFunctor {
public:
 virtual void execute(BaseA*, BaseB*) =0;
};

class MultiMethodDispatch {
 map<string,BaseABFunctor*> methods;
public:

 void registrate(BaseA* type_a, BaseB* type_b, BaseABFunctor* functor)
  {
    methods[string(typeid(*type_a).name)+"|"+string(typeid(*type_b).name)]=functor;
  }

 void execute(BaseA* a, BaseB* b)
  {
    method[string(typeid(*a).name)+"|"+string(typeid(*b).name)]->execute(a,b);
  }
};



Цитата

Представьте, что мне усилие нужно считать в цикле на 100 нагрузок... не велики ли будут накладные расходы с этими вызовами?
Нет, не велики.

Цитата

Я говорил именно об агрегации, это вы решили обернуть это наследованием. 
Я это не решал, я так понял ваш вопрос. (О чем и написал, кстати)
Цитата

Так вот если нужно получить данные из самой маленькой - будет та цепочка вызовов, о которой я писал.
Сделайте во внешней матрешке методы для доступа на разные глубины по иерархии, тогда цепочки вызовов не будет. Если у вас вложенные объекты формируют контейнеры, то можно посмотреть в сторону STL - сделать аналоги STL'ных контейнеров и итераторов (для единообразия)

Цитата

Цитата(xvr @  8.11.2010,  15:59 Найти цитируемый пост)
Я уже 2 РАЗА давал одни и те же ссылки, вы с ними ознакомились?

А я писал всего один раз - с английским на "вы"  smile
На эту тему и на русском материалов немало
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
PM MAIL   Вверх
Нитонисе
Дата 9.11.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  9.11.2010,  16:04 Найти цитируемый пост)
Сделайте во внешней матрешке методы для доступа на разные глубины по иерархии, тогда цепочки вызовов не будет.

Тогда просто эта цепочка будет скрыта в реализации класса. Меня как раз именно неказитсая реализация смущает. А именно - вызовы функций, возвращающие объекты более нижнего уровня.
Например мне надо узнать параметр data из класса D на самом нижнем уровне, тогда получается такая цепочка
Код

A.getB().getC().getD().getData();


Цитата(xvr @  9.11.2010,  16:04 Найти цитируемый пост)
На эту тему и на русском материалов немало

Надо почитать.
PM MAIL   Вверх
xvr
Дата 9.11.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  9.11.2010,  17:07 Найти цитируемый пост)
 А именно - вызовы функций, возвращающие объекты более нижнего уровня.
Это как раз нормально

Цитата(Нитонисе @  9.11.2010,  17:07 Найти цитируемый пост)
Например мне надо узнать параметр data из класса D на самом нижнем уровне, тогда получается такая цепочка
А это можно и скрыть в классе повыше  smile 

PM MAIL   Вверх
Нитонисе
Дата 9.11.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  9.11.2010,  18:01 Найти цитируемый пост)
А это можно и скрыть в классе повыше

Скрыть-то можно, но я все о накладных расходах по получению нужной информации. Что бы получить данные data из класса с самого нижнего уровня надо в 5 раз больше времени, чем просто использовать эти данные по имени переменной (допустим глобальной).
PM MAIL   Вверх
mes
Дата 9.11.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  9.11.2010,  17:05 Найти цитируемый пост)
Скрыть-то можно, но я все о накладных расходах по получению нужной информации

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

Добавлено через 1 минуту и 35 секунд
Цитата(Нитонисе @  9.11.2010,  17:05 Найти цитируемый пост)
Что бы получить данные data из класса с самого нижнего уровня надо в 5 раз больше времени,

а не надо получать каждый элемент отдельно.. за один раз получаете структуру 4го уровня, и оперируете уже с ней smile



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 9.11.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  9.11.2010,  18:21 Найти цитируемый пост)
а не надо получать каждый элемент отдельно.. за один раз получаете структуру 4го уровня, и оперируете уже с ней

Это как?
PM MAIL   Вверх
mes
Дата 9.11.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  9.11.2010,  17:51 Найти цитируемый пост)
Это как? 

хм.. на абстрактном примере неудобно объяснять.. 
грубо говоря не бойтесь делать вложенные функции..

Добавлено через 8 минут и 40 секунд
ну а применительно к вашей задаче, думаю, будет удобно разбить на два слоя :
нижний - уровень формул, где все связи статические.. 
верхний - уровень визуализации, полиморфно объединяющий сущности нижнего уровня..

Добавлено через 12 минут и 36 секунд
могу показать на примере, если приведете полностью формулу расчета нагрузки .. 




--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 9.11.2010, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  9.11.2010,  19:05 Найти цитируемый пост)
могу показать на примере, если приведете полностью формулу расчета нагрузки .. 

Попробуйте) Только формула не расчета нагрузки, а расчета усилия от нагрузки. Вот функция, определяющие опорны моменты от нагрузки. Формула подсчета определяется на первом этапе в зависимости от типа опор, а затем от типа нагрузки. Вот эта ужасная функция  smile 
Код

int SimpleBeam::calcSupM(Load *l, float &m1, float &m2)
{
  int report = 0;
  if (leftSupport == Rigid)
  {
    // жесткая-жесткая
    if (rightSupport == Rigid)
    {
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = - value*length*length/12;
        m2 = m1;
        report = 1;
      }
      else if (PartLinearLoad *pll = dynamic_cast<PartLinearLoad*>(l))
      {
        float value = pll->getValue();
        unsigned int x = pll->getX();
        unsigned int s = pll->getS();
        float a = x + s/2;
        float b = length - a;
        m1 = - value*s*(a*b*b - s*s*(2*b - a)/12)/(length*length);
        m2 = - value*s*(a*a*b - s*s*(2*a - b)/12)/(length*length);
        report = 1;
      }
      else if (DotLoad *dl = dynamic_cast<DotLoad*>(l))
      {
        float value = dl->getValue();
        unsigned int x = dl->getX();
        float a = x/length;
        float b = 1 - a;
        m1 = - a*b*b*value*length;
        m2 = - a*a*b*value*length;
        report = 1;
      }
    }
    // жесткая-шарнир
    else if (rightSupport == Hinge)
    {
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = - value*length*length/8;
        m2 = 0;
        report = 1;
      }
      else if (PartLinearLoad *pll = dynamic_cast<PartLinearLoad*>(l))
      {
        float value = pll->getValue();
        unsigned int x = pll->getX();
        unsigned int s = pll->getS();
        float a = x + s/2;
        float b = length - a;
        m1 = - value*a*b*s*(length + b - s*s/(4*a))/(2*length*length);
        m2 = 0;
        report = 1;
      }
      else if (DotLoad *dl = dynamic_cast<DotLoad*>(l))
      {
        float value = dl->getValue();
        unsigned int x = dl->getX();
        float a = 1 - x/length;
        m1 = - (value*length/2)*a*(1 - a*a);
        m2 = 0;
        report = 1;
      }
    }
    // жесткая-консоль
    else if (rightSupport == Free)
    {
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = - value*length*length/2;
        m2 = 0;
        report = 1;
      }
      else if (PartLinearLoad *pll = dynamic_cast<PartLinearLoad*>(l))
      {
        float value = pll->getValue();
        unsigned int x = pll->getX();
        unsigned int s = pll->getS();
        m1 = - value*s*(x+s/2);
        m2 = 0;
        report = 1;
      }
      else if (DotLoad *dl = dynamic_cast<DotLoad*>(l))
      {
        float value = dl->getValue();
        unsigned int x = dl->getX();
        m1 = - value*x;
        m2 = 0;
        report = 1;
      }
    }
  }
  else if (leftSupport == Hinge)
  {
    // шарнир-жесткая
    if (rightSupport == Rigid)
    {
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = 0;
        m2 = - value*length*length/8;
        report = 1;
      }
      else if (PartLinearLoad *pll = dynamic_cast<PartLinearLoad*>(l))
      {
        float value = pll->getValue();
        unsigned int x = pll->getX();
        unsigned int s = pll->getS();
        float a = x + s/2;
        float b = length - a;
        m1 = 0;
        m2 = - value*b*a*s*(length + a - s*s/(4*b))/(2*length*length);
        report = 1;
      }
      else if (DotLoad *dl = dynamic_cast<DotLoad*>(l))
      {
        float value = dl->getValue();
        unsigned int x = dl->getX();
        float a = x/length;
        m1 = 0;
        m2 = - (value*length/2)*a*(1 - a*a);
        report = 1;
      }
    }
    // шарнир-шарнир
    else if (rightSupport == Hinge)
    {
      m1 = 0;
      m2 = 0;
      report = 1;
    }
  }
  else if (leftSupport == Free)
  {
    // консоль-жесткая
    if (rightSupport == Rigid)
    {
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = 0;
        m2 = - value*length*length/2;
        report = 1;
      }
      else if (PartLinearLoad *pll = dynamic_cast<PartLinearLoad*>(l))
      {
        float value = pll->getValue();
        unsigned int x = pll->getX();
        unsigned int s = pll->getS();
        float a = length - x - s;
        m1 = 0;
        m2 = - value*s*(a+s/2);
        report = 1;
      }
      else if (DotLoad *dl = dynamic_cast<DotLoad*>(l))
      {
        float value = dl->getValue();
        unsigned int x = dl->getX();
        float a = length - x;
        m1 = 0;
        m2 = - value*a;
        report = 1;
      }
    }
  }
  return report;
}

результаты расчета по ссылкам m1, m2 заносятся во внешние переменные.
PM MAIL   Вверх
mes
Дата 9.11.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  9.11.2010,  18:25 Найти цитируемый пост)
Только формула не расчета нагрузки, а расчета усилия от нагрузки. 

разумеется.. оговорился smile

Цитата(mes @  9.11.2010,  18:05 Найти цитируемый пост)
 формулу

Цитата(Нитонисе @  9.11.2010,  18:25 Найти цитируемый пост)
от эта ужасная функция  

я формулу просил,а не Вашу реализацию ее smile



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 9.11.2010, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  9.11.2010,  19:29 Найти цитируемый пост)
я формулу просил,а не Вашу реализацию ее

Так в этой функции ничего кроме ормул и нету собственно) В зависимости от типов опор и типа нагрузки. Я не совсем понял что вы имели ввиду, ну тогда вот вам одна формула, для расчета опорных моментов от точечной нагрузки на балке с жесткими опорами.
Код

if (DotLoad *dl = dynamic_cast<DotLoad*>(l))
      {
        float value = dl->getValue(); // значение нагрузки
        unsigned int x = dl->getX();  // координата нагрузки на балке
        float a = x/length;  // length - длина балки
        float b = 1 - a;  // вспомогательная величина
        m1 = - a*b*b*value*length; // опорный момент от нагрузки слева
        m2 = - a*a*b*value*length;  // опорный момент от нагрузки справа
      }

PM MAIL   Вверх
mes
Дата 9.11.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  9.11.2010,  19:21 Найти цитируемый пост)
Так в этой функции ничего кроме ормул и нету собственно)

нет там куча лишних деталей, на разбор и обдумывание которых неохота тратить время.. 

Цитата(Нитонисе @  9.11.2010,  19:21 Найти цитируемый пост)
В зависимости от типов опор и типа нагрузки.

вот а где эта зависимость ? чем выражена ?

Добавлено через 2 минуты и 55 секунд
напишите формулу, без учета ваших классов..мне интересны какие данные необходимы..

Добавлено через 3 минуты и 52 секунды
Цитата(Нитонисе @  9.11.2010,  19:21 Найти цитируемый пост)
ну тогда вот вам одна формула, для расчета опорных моментов от точечной нагрузки на балке с жесткими опорами.

мне не нужна для конкретной опоры.. мне нужна общая.. 


Это сообщение отредактировал(а) mes - 9.11.2010, 20:51


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 9.11.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  9.11.2010,  20:49 Найти цитируемый пост)
вот а где эта зависимость ? чем выражена ?

В кучке сравнений if...else... в зависимости от выбранного пути - свой расчет.

Цитата(mes @  9.11.2010,  20:49 Найти цитируемый пост)
мне не нужна для конкретной опоры.. мне нужна общая.. 

Так вот в том-то и дело, что общей формулы нету. Есть 18 частных формул. В кажой из этих формул используются разные данные и они по разному обрабатываются.
PM MAIL   Вверх
mes
Дата 9.11.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  9.11.2010,  20:58 Найти цитируемый пост)
В кучке сравнений if...else... в зависимости от выбранного пути - свой расчет.

У Вас же не вымышленные расчеты ? от чего зависит в реале ?

Добавлено через 2 минуты и 2 секунды
Цитата(Нитонисе @  9.11.2010,  20:58 Найти цитируемый пост)
Так вот в том-то и дело, что общей формулы нету.

не верю © есть хотя бы  логическое описание происходящего.. 


Цитата(Нитонисе @  9.11.2010,  20:58 Найти цитируемый пост)
Есть 18 частных формул.

опять свою реализацию подставляете ? 


Цитата(Нитонисе @  9.11.2010,  20:58 Найти цитируемый пост)
В кажой из этих формул используются разные данные и они по разному обрабатываются. 

прям уж так разные ?!

Добавлено через 3 минуты и 12 секунд
а также вопорос, что у Вас будет кроме балок, куда можно приложить нагрузку ? и чем кроме вида и названия они отличаются от балки ..

Добавлено через 10 минут и 55 секунд
взял для примера пару расчетов из вашей функции
Цитата(Нитонисе @  9.11.2010,  18:25 Найти цитируемый пост)
 if (rightSupport == Rigid)
    {
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = - value*length*length/12;
        m2 = m1;
        report = 1;
      }..

 else if (rightSupport == Hinge)
    {
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = - value*length*length/8;
        m2 = 0;
        report = 1;
      }


видно что единственное чем отличаются расчеты для Rigid и Hinge это коэффициент (8 или 12).

Добавлено через 12 минут и 5 секунд
Код

 m1 = - value*length*length/2;

для третего типа опоры то же самое.. 



--------------------
PM MAIL WWW   Вверх
mes
Дата 9.11.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  9.11.2010,  18:25 Найти цитируемый пост)
    m1 = - a*b*b*value*length;

да и вот тут явно общность видна.. и в осзтальных местах тоже.. и где ж хваленное знание предметной области ?! 
 smile 

Это сообщение отредактировал(а) mes - 9.11.2010, 22:52


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 9.11.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  9.11.2010,  22:33 Найти цитируемый пост)
У Вас же не вымышленные расчеты ? от чего зависит в реале ?

Вот в реале усилия и зависят от типов опор и от типа нагрузки)

Цитата(mes @  9.11.2010,  22:33 Найти цитируемый пост)
не верю © есть хотя бы  логическое описание происходящего.. 

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

Цитата(mes @  9.11.2010,  22:33 Найти цитируемый пост)
прям уж так разные ?!

Да - разные. Например чтобы обработать линейную нагрузку на всей балке нас интересует только длина балки и величина нагрузки. Этого достаточно чтобы вычислить опорные моменты. Однако расчетные формулы зависят от типов опор. Если же мы считаем усилия от точечной нагрузки, то кроме значения нам еще надо и привязка нагрузки к одной из опор, а если мы считаем линейную нагрузку на части балки, то нам нужно знать привязку этой нагрузки к опорам и длину приложения. Подмножество типов нагрузок может быть дополнено еще довольно значительным количеством нагрузок, которые встречаются значительно реже, но все же.

Цитата(mes @  9.11.2010,  22:33 Найти цитируемый пост)
а также вопорос, что у Вас будет кроме балок, куда можно приложить нагрузку ? и чем кроме вида и названия они отличаются от балки ..

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

Цитата(mes @  9.11.2010,  22:33 Найти цитируемый пост)
видно что единственное чем отличаются расчеты для Rigid и Hinge это коэффициент (8 или 12).
Так это ведь существенно!

Добавлено через 1 минуту и 39 секунд
Цитата(mes @  9.11.2010,  22:52 Найти цитируемый пост)
да и вот тут явно общность видна.. и в осзтальных местах тоже.. и где ж хваленное знание предметной области ?! 

К чему вы клоните?  smile 
PM MAIL   Вверх
mes
Дата 10.11.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  9.11.2010,  21:59 Найти цитируемый пост)
 так как описание нагрузки для задания на плоскости совсем другое, нежели описание нагрузки на стержне.

вот одно узнали.... значит для всех стержней расчет одинаков ?

Добавлено @ 00:03
Цитата(Нитонисе @  9.11.2010,  21:59 Найти цитируемый пост)
Цитата

это коэффициент (8 или 12).

Так это ведь существенно!

а я разве говорю не существенно ? я говорю о том что опора характеризуется коэфицентом чего то.. 
чего именно Вам видней.. Вот вроде и второй пункт решен..

Добавлено @ 00:05
Цитата(Нитонисе @  9.11.2010,  21:59 Найти цитируемый пост)
Если же мы считаем усилия от точечной нагрузки, то кроме значения нам еще надо и привязка нагрузки к одной из опор, а если мы считаем линейную нагрузку на части балки, то нам нужно знать привязку этой нагрузки к опорам и длину приложения. 

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

Добавлено @ 00:10
Цитата(Нитонисе @  9.11.2010,  21:59 Найти цитируемый пост)
К чему вы клоните? 

К тому что Вы не проработали вопрос, и пытаетесь его решить в лоб, несмотря на то, что даже само решение показывает Вам, иль даже кричит, что надо не так smile

Добавлено @ 00:11
Как подсказка, забудьте про классы, и напишите расчетные функции (пусть несколько если легче), только на основании необходимых передаваемых в них данных.. (объединять данные можно только в простые структуры) 


Это сообщение отредактировал(а) mes - 10.11.2010, 00:36


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  00:01 Найти цитируемый пост)
вот одно узнали.... значит для всех стержней расчет одинаков ?

Нет. Все расчетные формулы, интересующие меня на данном этапе, я привел в своей большой функции чуть выше. Вы считаете это одинаковые формулы? Хм  smile 

Цитата(mes @  10.11.2010,  00:01 Найти цитируемый пост)
а я разве говорю не существенно ? я говорю о том что опора характеризуется коэфицентом чего то.. чего именно Вам видней.. Вот вроде и второй пункт решен..

Какой пункт? Я теряю вашу нить рассуждений)) Что касается 8 и 10 - это эмпирические выражения, они ни от чего не зависят и постоянны при данных опорах балки и данном типе нагрузки.

Цитата(mes @  10.11.2010,  00:01 Найти цитируемый пост)
все это спокойно выражется в формуле..  грубо говоря Вам не надо знать тип нагрузки, а нужно лишь знать точки приложения..

Ну что ж, сказали А, скажите и Б. Есть балка, две жесткие заделки по краям. Нагрузка может быть точечная (DotLoad), а может быть линейная по всей длине (LinearLoad). Покажите как будет выглядеть единая универсальная формула (как выглядят частные формулы можно посмотреть в моей большой функции).

PM MAIL   Вверх
mes
Дата 10.11.2010, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  00:08 Найти цитируемый пост)
вот одно узнали.... значит для всех стержней расчет одинаков ?

Нет. Все расчетные формулы, интересующие меня на данном этапе, я привел в своей большой функции чуть выше. Вы считаете это одинаковые формулы? Х

даже если функций несколько, они то для всех стержней одинаковы ? при наличие других стержней, кроме упомянутой однопролетной балки..

Добавлено @ 01:15
Цитата(Нитонисе @  10.11.2010,  00:08 Найти цитируемый пост)
Что касается 8 и 10 - это эмпирические выражения, они ни от чего не зависят и постоянны при данных опорах балки и данном типе нагрузки

значит зависят по таблице..

Добавлено через 5 минут и 34 секунды
Цитата(Нитонисе @  10.11.2010,  00:08 Найти цитируемый пост)
Ну что ж, сказали А, скажите и Б. 

т.е. Вам не только подсказать, но еще и сделать за Вас ?!

Цитата(Нитонисе @  10.11.2010,  00:08 Найти цитируемый пост)
Покажите как будет выглядеть единая универсальная формула (как выглядят частные формулы можно посмотреть в моей большой функции).

Для начала приведите свои функции в читабельный вид...  smile

Добавлено через 6 минут и 3 секунды
лазить в такой грязи и разбираться, жаль зрения..

Добавлено через 11 минут и 21 секунду
кстати покажите что у вас сейчас внутри классов опор..

Добавлено через 12 минут и 6 секунд
и  перечислите какие типы опор бывают..

Добавлено через 12 минут и 23 секунды
кроме тех трех что уже упомянуты

Это сообщение отредактировал(а) mes - 10.11.2010, 01:16


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



к тому же у вас сейчас повторение для симметричных функций относительно типа опор.. 



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



mes, вобщем-то не имеет смысла обсуждать этот вопрос дальше, так как для того чтобы вы поняли о чем идет речь - вам придется освоить профессию расчетчика строительных конструкций. Что касается меня, то я работаю с этими расчетами регулярно, так как это является моей основной профессией.
Цитата(mes @  10.11.2010,  01:12 Найти цитируемый пост)
лазить в такой грязи и разбираться, жаль зрения.. 

А вот это интересно) Что, по вашему, является грязью в моей функции расчета усилий?)

PM MAIL   Вверх
mes
Дата 10.11.2010, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  00:28 Найти цитируемый пост)
А вот это интересно) Что, по вашему, является грязью в моей функции расчета усилий?)

т.е Вы считаете блоки внутри функций у вас написаны хорошо и ясно ?




--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  01:31 Найти цитируемый пост)
т.е Вы считаете блоки внутри функций у вас написаны хорошо и ясно ?

В этой функции я вижу только один недостаток - она большая. Как вы оформляете блоки внутри функций, чтобы бы было "хорошо и ясно"?)
PM MAIL   Вверх
mes
Дата 10.11.2010, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  00:28 Найти цитируемый пост)
общем-то не имеет смысла обсуждать этот вопрос дальше, так как для того чтобы вы поняли о чем идет речь - вам придется освоить профессию расчетчика строительных конструкций. 

ну если не хотите продолжать Ваше дело..  ну а мне не надо становиться расчетникoм.. это Ваша задача.. а для того чтоб отличить логичный код от нелогичного, мне формулы не нужны.. 
разве что описание доменной области, и то чтоб подсказать, как лучше выразить в терминах языка..

Добавлено @ 01:36
Цитата(Нитонисе @  10.11.2010,  00:34 Найти цитируемый пост)
 Как вы оформляете блоки внутри функций, чтобы бы было "хорошо и ясно"?) 

меня не смущает размер самой функции.. (исправить это дело 5ти минут)

но возьмем любой блок
Цитата(Нитонисе @  9.11.2010,  18:25 Найти цитируемый пост)
      if (LinearLoad *ll = dynamic_cast<LinearLoad*>(l))
      {
        float value = ll->getValue();
        m1 = - value*length*length/2;
        m2 = 0;
        report = 1;

это самый простой и то выглядит, глаз сломать можно..

Добавлено @ 01:40
ну я так понимаю.. вы не понимаете как исправить ситуацию..
ну давайте вместе.. я буду писать условия, вы код, а я подправлять.. посмотрим что получится..

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

Добавлено @ 01:42
только без непонятных цифр, как например 12.. если это констатнта, значит давайте соответсвующее имя..


Это сообщение отредактировал(а) mes - 10.11.2010, 02:20


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



что то я не дождусь.. сделаю  первый шаг :

Код

//  linear_load, ridgit & ridgit
m1 = 
  m2 = load.value * pow(bar.length, 2) * rr_rate; 
rr_rate -  RidgitRidgit коэфициент. (1/12)

для двух других видов опор, будет меняться лишь коэфициент ?
тогда я так понимаю будет :
Код

m = load.value * pow(bar.length, 2);
m1 = m * rate1;
m2 = m * rate2;


Это сообщение отредактировал(а) mes - 10.11.2010, 02:15


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  01:34 Найти цитируемый пост)
это самый простой и то выглядит, глаз сломать можно.

Вы так и не написали вариант, когда "глаз не ломается"))

Цитата(mes @  10.11.2010,  01:58 Найти цитируемый пост)
rr_rate -  RidgitRidgit коэфициент. (1/12)

Ну, если вам понятнее символьный язык - ваше дело, мне понятнее цифры) они однозначны, да и код короче, нагляднее и привычнее (с точки зрения реальных расчетов).

Цитата(mes @  10.11.2010,  01:58 Найти цитируемый пост)
для двух других видов опор, будет меняться лишь коэфициент ?тогда я так понимаю будет :

К чему это приведет? К запутанной структуре функции. Сейчас в ней все прозрачно  - идет проверка типов опор и для уникальной пары четко прописаны опорные усилия. В вашем же случае можно сократить код, но он потеряет наглядность... дело вкуса. Мне видится оптимизация только в выделении отдельных блоков в отдельные же функции.

Это сообщение отредактировал(а) Нитонисе - 10.11.2010, 02:22
PM MAIL   Вверх
mes
Дата 10.11.2010, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  01:22 Найти цитируемый пост)
Ну, если вам понятнее символьный язык - ваше дело, мне понятнее цифры) они однозначны, да и код короче, нагляднее и привычнее (с точки зрения реальных расчетов).

почитайте про антипаттерн "магические числа"

Добавлено через 1 минуту и 18 секунд
Цитата(Нитонисе @  10.11.2010,  01:22 Найти цитируемый пост)
Вы так и не написали вариант, когда "глаз не ломается"))

для этого я должен прдставить картину взаимосвязей, а ее Вы пока не описали smile

Добавлено через 3 минуты и 36 секунд
Цитата(Нитонисе @  10.11.2010,  01:22 Найти цитируемый пост)
 Сейчас в ней все прозрачно  - идет проверка типов опор и для уникальной пары четко прописаны опорные усилия.

ок.. давайте отолкнемся от этого..
и так у нас три вида опор, три вида нагрузок и конструкция состоящая из стержня/балки и двух опор .
опора не имеет своих данных, но от нее зависит какую формулу применить.. так? 



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  02:31 Найти цитируемый пост)
почитайте про антипаттерн "магические числа"

Вы просто не понимаете природу этих цифр, поэтому хотите их убрать из выражения. Но они абсолютная константа и не поменяются никогда. Даже такая константа как 100 обозначающая количество копеек в рубле - менее постоянна, чем эти числа. Ведь кому-то может придти в голову сменить соотношение рублей-копеек. А если кто-то решит сменить коэффициенты в формулах, то ему придется сменить и саму формулу.

Второй же сомнительный плюс - уменьшение количества кода путем запутывания его структуры. Несмотря на то, что вы нашли схожие выражения в разных формулах - это не даст дивидендов, потому что все равно эти выражение должны быть включены в свои разделы. Если попытаться их объединить, то получатся сложные и неочевидные с первого взгляда конструкции. Имею ввиду в первую очередь условия условных переходов.
PM MAIL   Вверх
mes
Дата 10.11.2010, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  01:39 Найти цитируемый пост)
Вы просто не понимаете природу этих цифр,

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

Цитата(Нитонисе @  10.11.2010,  01:39 Найти цитируемый пост)
Второй же сомнительный плюс - уменьшение количества кода путем запутывания его структуры. 

мы пока не запутываем, а разбираемся.. потому что условия пока не понятны.. но потихоньку просветляется.. smile



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  02:47 Найти цитируемый пост)
мы пока не запутываем, а разбираемся.. потому что условия пока не понятны.. но потихоньку просветляется.. 

Вот общая конструкция моей функции
Код

если левая опора - жесткая
{
    если правая опора - жесткая
    {
        если нагрузка линейная
        {
            вычисляем опорные усилия 
        }
        если нагрузка линейная на чсати балки
        {
            вычисляем опорные усилия 
        } 
        если нагрузка точечная
        {
            вычисляем опорные усилия 
        }
    }
    если правая опора - шарнир
    {
        если нагрузка линейная
        {
            вычисляем опорные усилия 
        }
        если нагрузка линейная на чсати балки
        {
            вычисляем опорные усилия 
        } 
        если нагрузка точечная
        {
            вычисляем опорные усилия 
        }
    }
    если правая опора - консоль
    {
        если нагрузка линейная
        {
            вычисляем опорные усилия 
        }
        если нагрузка линейная на чсати балки
        {
            вычисляем опорные усилия 
        } 
        если нагрузка точечная
        {
            вычисляем опорные усилия 
        }
    }
}

если левая опора - шарнир
{
    если правая опора - жесткая
    {
        если нагрузка линейная
        {
            вычисляем опорные усилия 
        }
        если нагрузка линейная на чсати балки
        {
            вычисляем опорные усилия 
        } 
        если нагрузка точечная
        {
            вычисляем опорные усилия 
        }
    }
    если правая опора - шарнир
    {
        если нагрузка линейная
        {
            вычисляем опорные усилия 
        }
        если нагрузка линейная на чсати балки
        {
            вычисляем опорные усилия 
        } 
        если нагрузка точечная
        {
            вычисляем опорные усилия 
        }
    }
}

если левая опора - консоль
{
    если правая опора - жесткая
    {
        если нагрузка линейная
        {
            вычисляем опорные усилия 
        }
        если нагрузка линейная на чсати балки
        {
            вычисляем опорные усилия 
        } 
        если нагрузка точечная
        {
            вычисляем опорные усилия 
        }
    }
}

Я тут не показал еще переменную report, которую возвращает функция. Она равна 0 - если вычислить усилия не удалось и 1 - если удалось.
Конструкция очень прямая - тупой перебор всех возможных сочетаний нагрузок и типов опор.
Попытайтесь упростить общую конструкцию на основе выявленных вами математических закономерностей. Я даже подскажу их вам больше - везде, где опора шарнир (Hinge), либо консоль (Free) соответствующее усилие всегда равно нулю.


PM MAIL   Вверх
xvr
Дата 10.11.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  10.11.2010,  09:53 Найти цитируемый пост)
Вот общая конструкция моей функции
Ваша конструкция - написанный вручную статический диспетчер для вызова Мультиметода. Если вам она кажется логичной (и функции внутри совершенными) то мой совет - забейте на ООП и пишите в процедурном стиле  smile 

PM MAIL   Вверх
Нитонисе
Дата 10.11.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  10.11.2010,  10:26 Найти цитируемый пост)
то мой совет - забейте на ООП и пишите в процедурном стиле 

На это я пойтить не могу!  smile 

Только я не совсем понял какое отношение имеет ООП к логике моей функции?

Это сообщение отредактировал(а) Нитонисе - 10.11.2010, 10:33
PM MAIL   Вверх
mes
Дата 10.11.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  08:53 Найти цитируемый пост)
Вот общая конструкция моей функции

как раз эта часть и так понятна.. 
smile

Цитата(Нитонисе @  10.11.2010,  08:53 Найти цитируемый пост)
 Я даже подскажу их вам больше - везде, где опора шарнир (Hinge), либо консоль (Free) соответствующее усилие всегда равно нулю.

вот ее надо было еще на прошлой странице озвучить smile 

Цитата(Нитонисе @  10.11.2010,  08:53 Найти цитируемый пост)
Попытайтесь упростить общую конструкцию на основе выявленных вами математических закономерностей. 

почему математических ? вполне возможно табличных  закономерностей.

Добавлено @ 13:18
итак для начала определим функции расчетники :
Код

// r- riged, h-hince, f-free, l-linear, p-partlinear, d-dot , _ - any
namespace ns_calc_moment {
float r_l (size_t l, float v, size_t k)  { return v*l*l/k; } // helper
 
float rrl (size_t l, float v) { return r_l(l,v); }
float rhl (..) ..
float rfl (..) ..
float rrp (..) ..
float rhp (..) ..
float rfp (..) ..
float rrd (..) ..
float rhd (..) ..
float rfd (..) ..

}



Это сообщение отредактировал(а) mes - 10.11.2010, 13:19


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  13:12 Найти цитируемый пост)
итак для начала определим функции расчетники :

Если честно, то непонятно что вы такое понаписали и что вы ожидаете вместо точек.
PM MAIL   Вверх
mes
Дата 10.11.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



думаю Вам удобнее суппорт ассоцировать напрямую с ид (т.е. или самого сделать целочисленной константой/енумом или ее возврающим )
тогда база будет выглядить примерно так 
Код


struct linear_load;
struct partlinear_load;
struct dot_load;
struct i_load_visitor
{
    virtual void visit (linear_load&) =0;
    virtual void visit (partlinear_load&) =0;
    virtual void visit (dot_load&) =0;    
}; 
struct i_load 
{
   virtual ~i_load () {}
   virtual void accept (i_load_visitor&) =0;   
};

struct linear_load : i_load
{
   virtual void accept (i_load_visitor& v) { v.visit(*this); }
};
struct partlinear_load : i_load
{
   virtual void accept (i_load_visitor& v) { v.visit(*this); }
};
struct dot_load : i_load
{
   virtual void accept (i_load_visitor& v) { v.visit(*this); }
};

struct construction
{
   i_load * load;
   size_t   length;
   size_t   support[2];   
   float    moment[2];
   
   void calc_moments ();
   
};

void  construction::calc_moments ()
{   

   struct load_visitor : i_load_visitor
   { 
   // !!
   };
}


Цитата(Нитонисе @  10.11.2010,  13:11 Найти цитируемый пост)
Если честно, то непонятно что вы такое понаписали и что вы ожидаете вместо точек. 

в скобках необходимые параметры, а в конце реализация.. 
Код

например
float rrd ( size_t l /* length */
          , size_t x /* load_x */
          , float v  /* load_value */ ) 
{ 
     ну и тут расчет из вашей основной функции.. 
}


Добавлено @ 14:20
Цитата(mes @  10.11.2010,  13:14 Найти цитируемый пост)
   // !!

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


Это сообщение отредактировал(а) mes - 10.11.2010, 14:28


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  14:14 Найти цитируемый пост)
тут будет связь с расчетниками... чуть позже напишу. 

Напишите. Общую задумку я пока не понимаю.
PM MAIL   Вверх
mes
Дата 10.11.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  13:28 Найти цитируемый пост)
Напишите. Общую задумку я пока не понимаю. 

вот в общей функции :
Код

void  construction::calc_moments ()
{
// с применением "хака" о знании того,
// что для всех кроме riget moment будет равен 0

  
   struct for_riget : i_load_visitor
   { 
      size_t len;     // bar_length
      size_t s2;      // supports      
      float m1, m2; // moments
   
      
      for_riget ( size_t len_
                , size_t s2_ ) : len (len_)
                               , s2  (s2_)                   
      {
      }
      void operator () (i_load& l) 
      {
         l.accept(*this);
      }
      void visit (linear_load& l)
      {
          using namespace calc_moment;
          switch (s2)
          
          {
              case supports::riget :
              {
                m1 = rrl(len, l.value);
                m2 = m1;
                return;
              }
              case supports::hince :
              {
                m1 = rhl(len, l.value);
                m2 = 0;                
                return;
              }
             case supports::free :
              {
                m1 = rfl(len, l.value);
                m2 = 0;                
                return;
              } 
          }     
       }
       virtual void visit (partlinear_load&l)
       {
       // аналогично linear_load
       }
       virtual void visit (dot_load&l)
       {
       // аналогично linear_load       
       }
         
   };

   if (support[0]==supports::riget)
   {
     for_riget calc(length, support[1]);
     calc (*load);
     moment[0] = calc.m1;
     moment[1] = calc.m2;
   }    
   else if (support[1]==supports::riget)
   {
     for_riget calc(length, support[0]);
     calc (*load);
     moment[1] = calc.m1;
     moment[0] = calc.m2;
   }
   else 
   {
       moment[0] = moment[1] =0;
   }
}

теперь нужно подумать что еще можно "съэкономить"


Это сообщение отредактировал(а) mes - 10.11.2010, 16:07


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



вот подправлено немного :
Код

void  construction::calc_moments ()
{
// с применением "хака" о знании того,
// что для всех кроме riget moment будет равен 0

  
   struct for_riget : i_load_visitor
   { 
      size_t len;     // bar_length
      size_t sup;      // supports      
      float  m;
   
      
      for_riget ( size_t len_
                , size_t sup_ ) : len (len_)
                                , sup (sup_)                   
      {
      }
      float operator () (i_load& l) 
      {
         l.accept(*this);
         return m;
      }
      void visit (linear_load& l)
      {
          using namespace calc_moment;
          
          typedef float (*fn_t)(size_t, float)

          static  fn_t vt = { &rrl, &rhc, &rfl }; 
          
          if (sup<3)  m = vt[sup] (len, l.value);
  
       }
       virtual void visit (partlinear_load&l)
       {
       
       }
       virtual void visit (dot_load&l)
       {
       
       }
         
   };

   if (support[0]==supports::riget)
   {
     for_riget calc(length, support[1]);   
 
     moment[0] = calc(*load)
  
     if (support[1]==supports::riget)    
       moment[1] = moment[0];     
   }    
   else if (support[1]==supports::riget)
   {
     for_riget calc(length, support[0]);
 
     moment[1] = calc(*load);
     moment[0] = 0;
   }
   else 
   {
       moment[0] = moment[1] =0;
   }
}



Это сообщение отредактировал(а) mes - 10.11.2010, 16:06


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  15:24 Найти цитируемый пост)
теперь нужно подумать что еще можно "съэкономить"

Мне вообще-то непонятно - а что вы тут сэкономили то? Закрывая глаза на сложную для восприятия структуру кода можно отметить следующее - суть ее аналогична моей. Вы так же проверяете типы опор и тип нагрузки, запуская те или иные обработчики. Только я не совсем понял одну вещ. Вы проверяете первую опору switch (s2), но не проверяете вторую switch (s2[1]), хотя от этого зависит алгоритм вычислений... 
Вобщем оформление кода - дело субъективного восприятия. Вы не можете читать мой код, я не могу читать ваш код.

Что же касается "красивого" решения вопроса вызывания нужной функции вычисления усилий в зависимости от типов опор и типов нагрузки - смотрю в сторону мультиметодов. Очень интересная тема, надо с ней поподробнее разобраться)
PM MAIL   Вверх
mes
Дата 10.11.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  14:50 Найти цитируемый пост)
Мне вообще-то непонятно - а что вы тут сэкономили то? Закрывая

пока мало чего.. не торопитесь.. я еще не закончил smile

Добавлено через 44 секунды
Цитата(Нитонисе @  10.11.2010,  14:50 Найти цитируемый пост)
Вы проверяете первую опору switch (s2), но не проверяете вторую switch (s2[1]), хотя от этого зависит алгоритм вычислений... 

смотрите внимательно.. проверяются обе.. 
smile

Добавлено через 4 минуты и 21 секунду
возвращаемся к ns_calc_moment и добавляем туда функцию
Код

//a -auto for supports
float rаl (size_t s, size_t l, float v) 
{
    typedef float (*fn_t)(size_t l, float v)
    static vt[3] ={ &rrl, &rhl, &rfl };
    return vt[s](l,v);
}




--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  15:51 Найти цитируемый пост)
пока мало чего.. не торопитесь.. я еще не закончил

Не трудитесь) Я уже вижу по вашему стилю, что он для меня неприемлем. Масса малопонятных однобуквенных обозначений, сложные программные констркции. Может вы что-то и сэкономите, но такую цену (сложность восприятия) я платить не готов)) Да и вопрос то был нев экономии, а в "грязном" коде. Сэкономить можно проще - просто вынести расчетные блоки в отдельные функции. Для меня не страшно большое количество кода (пусть и разбросанного по разным функциям), для меня важнее его понятность, эффективная работа, удобная модификация.
PM MAIL   Вверх
mes
Дата 10.11.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(mes @  10.11.2010,  14:42 Найти цитируемый пост)
   void visit (linear_load& l)
      {
          using namespace calc_moment;
          
          typedef float (*fn_t)(size_t, float)
          static  fn_t vt = { &rrl, &rhc, &rfl }; 
          
          if (sup<3)  m = vt[sup] (len, l.value);
  
       }

тогда станет :
Код

  void visit (linear_load& l)
  {
          m = calc_moment::ral (sup, length, l.value);                
 }


Добавлено через 3 минуты и 23 секунды
чтоб избежать лишнего расчета для rr, придется немножко лишнего кода написать.. 



--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(mes @  10.11.2010,  14:42 Найти цитируемый пост)
  if (support[0]==supports::riget)
   {
     for_riget calc(length, support[1]);   
 
     moment[0] = calc(*load)
  
     if (support[1]==supports::riget)    
       moment[1] = moment[0];     
   }    
   else if (support[1]==supports::riget)
   {
     for_riget calc(length, support[0]);
 
     moment[1] = calc(*load);
     moment[0] = 0;
   }
   else 
   {
       moment[0] = moment[1] =0;
   }

после поправки :
Код

   struct helper
   {
      static void calc (size_t len, size_t sup, i_load& load)
      {
         for_riget calc(len, sup);       
         return calc (*load);
      }

   }
    
   if (support[0] == supports::riget)
   {
         moment[0] = helper::calc(length, support[1], *load);        
         moment[1] = (support[1]==support[0])         
                   ?  moment[0] 
                   : 0;
    }         
    else if (support[1]==supports::riget)
    { 
         moment[0] = helper::calc(length, support[1], *load);        
         moment[1] = 0;   
     }
     else
         moment[0] = moment[1] = 0;
 

Это сообщение отредактировал(а) mes - 10.11.2010, 16:51


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



итак у нас получилась вспомогательная функция :
Код

static float for_riget (size_t len, size_t sup, i_load& load)
{ 
   struct helper : i_load_visitor
   { 
      size_t len;     // bar_length
      size_t sup;      // supports      
      float  m;
         
      helper ( size_t len_ ,  size_t sup_ ): len (len_)  , sup (sup_)  { }

      void operator () (i_load& l)   { l.accept(*this);   }
      void visit (linear_load& l)    { calc_moment::ral (len, l.value);  }
      void visit (partlinear_load&l) { calc_moment::rap (len, ..); }      
      void visit (dot_load&l)        { calc_moment::rad (len, ..); }
         
   };
     
   helper h(len, sup);       
   h (*load);
   return h.m
}

и основная 
Код


void  construction::calc_moments ()
{
// с применением "хака" о знании того,
// что для всех кроме riget moment будет равен 0
    
   if (support[0] == supports::riget)
   {
         moment[0] = for_riget (length, support[1], *load);        
         moment[1] = (support[1]==support[0])         
                   ?  moment[1] 
                   : 0;
    }         
    else if (support[1]==supports::riget)
    { 
         moment[1] = for_riget (length, support[0], *load);        
         moment[0] = 0;   
     }
     else
         moment[0] = moment[1] = 0;   
}


Добавлено @ 16:49
вот к последнему варианту можете придераться smile только не к синтаксическим ошибках, так как писал на коленке smile


Это сообщение отредактировал(а) mes - 10.11.2010, 16:53


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 10.11.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  10.11.2010,  16:46 Найти цитируемый пост)
вот к последнему варианту можете придераться

Да я в общем-то уже "придрался" - код не облегчился и стал сложнее, "заковырестее". Я не вникал в правильность реализации отдельно взятых функций (точнее в определнии верного пути к нужному блоку), так как для меня такие программные конструкции не читаемы, жалко времени. Всущности организация кода должна быть понятна вам и совсем не обязательно, чтобы она была понятно кому-то еще, если только вы не работаете в команде.
PM MAIL   Вверх
mes
Дата 10.11.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  10.11.2010,  16:10 Найти цитируемый пост)
Да я в общем-то уже "придрался" - код не облегчился и стал сложнее, "заковырестее".

да кода стало чуточку больше.. 
1.  но мы избавились от медленного динамик_каста, 
2. автоматизировалась часть по выбору нужной ветви
3. компилтайм проверка, для всех лоадов, о наличии реализации для конкретного потомка (патерн визитер)
4. все функции расчетники выведены из в отдельную область.. 
(ах да про них забыл.. с учетом последних изменений они должны иметь вид аналогичный : float rrl (size_t len, linear_load& l));
5. в отличие от мултиметодов, для которых еще чуточку кода добавиться, мы использовали "знание о riget"
smile
"заковырестей" он стал для Вас, но зато стал более "сопровождаем" smile
хотя по сути ничего сложного нет, если понять суть на которой он основан smile

Это сообщение отредактировал(а) mes - 10.11.2010, 17:26


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



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





Это сообщение отредактировал(а) mes - 10.11.2010, 18:06


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



http://liveworkspace.org/code/36203ae8fe26...a690733c9408081
вот расчет для линейной нагрузки, для произвольного сочетания двух опор..

Добавлено @ 20:06
вместо цифр (3,4,5) соответсвующий расчет разумеется..
ну а main просто для теста.. 

ну и для наглядности выложу тут :
Код

void rrl (float& m1, float& m2, size_t len, linear_load& load)
{
     m1 = 3;     
     m2 = m1;
}
void rhl (float& m1, float& m2, size_t len, linear_load& load)
{
     m1 = 4;
     m2 = 0;
}
void rfl (float& m1, float& m2, size_t len, linear_load& load)
{
     m1 = 5;
     m2 = 0;
}
void nnl (float& m1, float& m2, size_t len, linear_load& load)
{
     m1 =  m2 = 0;
}
void hrl (float& m1, float& m2, size_t len, linear_load& load)
{
   rhl (m2, m1, len, load);
}
void frl (float& m1, float& m2, size_t len, linear_load& load)
{
   rfl (m2, m1, len, load);
}

void aal (float& m1, float& m2
         ,size_t s1, size_t s2          
         ,size_t len, linear_load& load)
{
   typedef void (*fn_t)(float&, float&, size_t, linear_load&);

   static fn_t vt[3][3] = 
   { { &rrl, &rhl, &rfl }
   , { &hrl, &nnl, &nnl }
   , { &frl, &nnl, &nnl }
   };
    
   vt[s1][s2](m1,m2, len, load);
    
}


Это сообщение отредактировал(а) mes - 10.11.2010, 20:54


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.11.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



тогда диспетчер калькулятора будет выглядить так :
Код

void  construction::calc_moments ()
{ 
   struct helper : protected i_load_visitor
   { 
      helper ( construction &cs_ ): cs(cs_) { }  
 
      void calc () {  load.accept(cs.load); }

    protected:
      void visit (linear_load& load)    
      {
        calc_moment::aal ( cs.moment[0],  cs.moment[1]
                         , cs.support[0], cs.support[1]
                         , cs.length, load );                 
      }
      void visit (partlinear_load&l) { /* .. */  }  
      void visit (dot_load&l) {  /* .. */ }

      construction & cs;
   };

   helper h(*_this);
   h.calc();
}


Добавлено @ 20:40
или для вашего стиля  (с динамик кастом )
Код

void  construction::calc_moments ()
{ 
   if  (auto * pload = dynamic_cast<linear_load*> (this->load) )
   { 
        calc_moment::aal ( cs.moment[0],  cs.moment[1]
                         , cs.support[0], cs.support[1]
                         , cs.length, *pload );                 
   }
   else
   if  (auto * pload = dynamic_cast<partlinear_load*> (this->load) )
   { 
        calc_moment::aap ( .. );
   }
   else
   if  (auto * pload = dynamic_cast<dot_load*> (this->load) )
   { 
        calc_moment::aad ( .. );                 
   }

}

P.S. если auto не поддерживается, значит вместо него соответсвующий тип.. 

оба варианта практически равноправны.. первый чуточку быстрей, а с динамик_кастом чуточку проще.. 
выбирайте на свой вкус.. если что то осталось непонятное,  могу объяснить smile


Это сообщение отредактировал(а) mes - 10.11.2010, 20:53


--------------------
PM MAIL WWW   Вверх
baldina
Дата 11.11.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



ребят, тут поглядите
PM MAIL   Вверх
Нитонисе
Дата 11.11.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(baldina @  11.11.2010,  10:42 Найти цитируемый пост)
ребят, тут поглядите

Мультиметоды нравятся, но не могу разобраться с их реализацией. Есть хороший ресурс на русском языке с мельчайшим разжевыванием?  smile 
PM MAIL   Вверх
baldina
Дата 11.11.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



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

PM MAIL   Вверх
Нитонисе
Дата 11.11.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(baldina @  11.11.2010,  14:59 Найти цитируемый пост)
ну так вы уже который день обсуждаете именно реализацию мультиметодов на конкретном примере

Вроде бы их мы не обсуждали.

Цитата(baldina @  11.11.2010,  14:59 Найти цитируемый пост)
нет тут простых путей

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


PM MAIL   Вверх
baldina
Дата 11.11.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата(Нитонисе @  11.11.2010,  15:21 Найти цитируемый пост)
Вроде бы их мы не обсуждали

у mes спросите))))

Цитата(Нитонисе @  11.11.2010,  15:21 Найти цитируемый пост)
Я уже понял, что простых путей нет, но правильно ли я понимаю, что мультиметод имеет смысл использовать в случае если некая функция работает с двумя и более объектами, которые в сигнатуре функции объявлены как указатели на базовый класс? 

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

вообще мультиметод это то, чего в С++ нет (и хотя уже лет 7-8 обсуждаются возможные технические и синтаксические пути ввода их в язык, непохоже, что в обозримом будущем они появятся). а раз нет, то можно говорить не об использовании, а моделировании похожего поведения.
PM MAIL   Вверх
mes
Дата 11.11.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  11.11.2010,  14:21 Найти цитируемый пост)
их мы не обсуждали.

их. точнее  упрощенный частный случай, где в качестве одного из типов выступает id.. 
smile

Добавлено через 3 минуты и 17 секунд
т.е. если классический мултиметод имеет условную сигнатуру
void mm (virtual a&, virtual b&, virtual b& ); // 3х мерный случай

то наша функция имеет
void mm (virtual load&, size_t s1, size_t s2 ); // где s1 и s2 условно ассоциированные с типом идентификаторы..



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.2178 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.