![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Приветствую всех.
Есть такой, упрощённый, случай:
Как создать наиболее рациональную реализацию setParams? Может есть паттерны или средства метапрограммирования(из того же boost'a)? Т.е. смысл в том, чтобы не завязываться на конкретном типе объекта наследника, а работать с данными-членами более гибко. Допустим по их именам(перечисление, задание, считывание...). Это сообщение отредактировал(а) W4FhLF - 13.3.2009, 19:06 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
т.е. setParams должен понять какой ему тип передали и задать соответствующие параметры???
а если написать виртуальную функцию, Body сделать абстрактным и вызывать его? Или еще проще, устанавливать параметры в конструкторе конкретного обьекта.. Задача немного неясна, что именно должна делать фунцкяи setParams ?? |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Заюзай enum в Body.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Это всё немного не то. Представь, что у нас 15 наследников Body и у каждого свой набор параметров. Допустим теперь, что в функции setParams тебе необходимо получить от пользователя необходимый набор параметров для переданного объекта body(ну в случае сферы ты печатаешь в консоли Radius и ждёшь ввода, в случае Cone печатаешь Radius, потом, после ввода радиуса, печатаешь Height и т.д.). Каковы твои действия? andrew_121, не понял. Это сообщение отредактировал(а) W4FhLF - 13.3.2009, 19:44 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если кол-во операций стабильно, но не стабильна иерархия (неизвестно конечное кол-во типов), то лучше просто использовать виртуальные функции
если ж наоборот иерархия классов постоянна(все конечные типы заранее известны), а общий интерфейс требует легкого расширения то смотрите паттерн визитор/двойная диспетчеризация. Это сообщение отредактировал(а) mes - 13.3.2009, 20:02 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот немного с форума об этом:
http://forum.vingrad.ru/index.php?showtopic=234230 http://forum.vingrad.ru/index.php?showtopic=235416 Это сообщение отредактировал(а) mes - 15.3.2009, 15:47 |
|||
|
||||
| AnLun |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 3.1.2008 Репутация: нет Всего: нет |
W4FhLF, а чем так плохо? |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
AnLun, что именно?
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
думаю что никак, так-как не понятно, что должна делать ф-я setParams, какие параметры(причем одни и те-же) передавать объектам разных типов... если нужно работать с геометрией, то я бы подумал о том, что-бы сделать вирт. ф-ю отвечающую за преобразования координат, которая в качестве параметра принимала-бы матрицу, на этой основе можно сделать любые преобразования, повороты, смещения и т.д.
Это сообщение отредактировал(а) Lazin - 20.3.2009, 11:52 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
а откуда setParams(Body*) возьмет значения параметров если они ей не передаются?
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот набросал условный пример работы :
Это сообщение отредактировал(а) mes - 20.3.2009, 12:44 |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
setParams(Body*) и Body::setParams() это одно и тоже, только 2е писать приятнее
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
тогда, как сказал mes, можно использовать либо паттерн visitor, либо обычную виртуальную ф-ю, но есть один ньюанс наиболее правильный ОО дизайн в этом случае, не строить огромную иерархию классов, состоящих их одних и тех-же элементов, а использовать композицию, то-есть выделить набор базовых примитивов (например point, angle, length) и создавать более сложные объекты на основе примитивных (например point, line(point, point), curve(point, point, point, point), rect(point, point, point, point), circle(point, length) etc) и создать механизм для поучения набора примитивных объектов из которых состоит более сложный объект в этом случае, можно будет придумать generic версию ф-ии setParams например, у нас есть набор объектов: Line, Circle, Rect нам нужно полиморфно с ними работать, сначала мы получаем первый объект Body(Line), и получаем список его параметров { "Begin":point, "End":point } и выводим на экран просьбу ввести сначала Begin, а затем End. Потом берем следующий объект Body(Circle) - {"Radius":length, "Center Coord.":point } и так далее.. В общем случае, нужна возможность получить список параметров, причем не только самих параметров, но и их атрибутов, таких как название, значение по умолчанию, ограничения, все зависит от задачи. Это сообщение отредактировал(а) Lazin - 20.3.2009, 12:40 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
"печатаешь в консоли Radius и ждёшь ввода"
значит надо вводить классы Radius, Height, Width, Lenght
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
В этом случае операции жестко привязаны к субъектам и не могут быть легко расширены. а для тс, насколько я понял, требуется отделить субъекты от операций производимых над ними Это сообщение отредактировал(а) mes - 20.3.2009, 13:05 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |