![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| djontat |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 21.2.2013 Репутация: нет Всего: нет |
Пишу классы для работы с двумерными, трехмерными и n-мерными точками пространства. Решил написать общий базовый класс и от него породить остальные конкретные классы. Получилось пока вот что:
- базовый абстрактный класс Point
- класс двумерных точек Point2D
Правильно ли все я написал? Какие подводные камни могут быть в будущем с таким кодом? В частности меня смущает то, что в классе Point2D для каждой операции (в представленном коде для операций == и +=) приходится писать по две функции и одна из функций с использованием dynamic_cast. Может быть есть другой выход(ы)? Спасибо. |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Я бы сказал, что в данной задаче как полиморфизм так и инкапсуляция излишни. Для хранения таких данных будет достаточно простой структуры. С Plain структурами было бы проще манипулировать. Класс удобно было бы создать для объединения точек в более крупные единицы. Например класс меша или контура. А у них уже можно создавать методы для обработки данных. Например поворот контура на некоторый угол или сглаживание или объединение контуров в один общий.
Это сообщение отредактировал(а) Alexeis - 21.2.2013, 14:27 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
А зачем ? Есть же Boost.Geometry
и ещё штришок... можно же ссылку кастить
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| djontat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 21.2.2013 Репутация: нет Всего: нет |
А чем ссылка лучше в этом случае? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
> А чем ссылка лучше в этом случае?
Меньше букафф ))) в смысле символов -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Правильно! чем их, меньше тем завсегда оно лучче!
Это сообщение отредактировал(а) volatile - 22.2.2013, 00:02 |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Карусель, карусель! Это радость для нас. Прокатись на нашей карусели! Ля-ля-ля!.... Добавлено через 2 минуты и 54 секунды
исключением djontat, а если point не Point2d ? и да с полиморфизмом намудрено.. пользоваться полученным будет имхо затруднительно.. |
||||
|
|||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
для каждого n собираешься класс порождать? шаблон+stl
|
||||
|
|||||
| djontat |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 21.2.2013 Репутация: нет Всего: нет |
например, для Point3D планируется оператор приведения в Point2D, путем отсечения третей координаты
нет, не для каждого, планирую всего три класса: Point2D, Point3D, PointND. По поводу намудренности с полиморфизмом и по поводу шаблон+stl: далее планирую классы такие как например отрезки (в двумерном, трехмерном и н-мерном пространстве)
и т.д. |
||||||
|
|||||||
| baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
для использования точек в отрезках полиморфизм вобщем-то не нужен.
PointND это интересно. Понятно, что имея PointND, он легко используется в качестве 2d или 3d. Фактически, такой класс с использованием stl написан выше. 2d и 3d будут выглядеть как
посмотри на конструктор
с его помощью может производиться и усечение, и расширение размерности. вобщем поизучай примеры, варианты, возможности. все тобой планируемое можно написать довольно коротко, при этом не в ущерб функционалу и понятности. Добавлено через 9 минут еще хочу спросить: Point, как я понимаю, у тебя базовый класс? Как будет обеспечиваться согласованность размерности m_a и m_b? Зачем вообще иметь Segment с концами обобщенной размерности? Все фигуры будут жить в пространстве одной размерности. |
||||||
|
|||||||
| djontat |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 21.2.2013 Репутация: нет Всего: нет |
PointND - это и есть класс точек с произвольной размерностью (включая 2 и 3 мерность). Решил выделить 2D и 3D в отдельные классы только ради эффективности. Такой код
планирую чтобы не нужно было вводить отдельно Segment2D и Segment3D. А насчет
хороший вопрос... Против шаблонов+stl ничего против не имею. В этом случае наверно придется делать след. образом
Правильно я понимаю? какие минусы в таком случае? |
||||||||
|
|||||||||
| djontat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 21.2.2013 Репутация: нет Всего: нет |
По поводу
Если в классе Point ввести метод size(), который возвращает размерность точки, а потом в конструкторе Segment проверять равенство размерности точек конца отрезка.... |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
такое решение называется преждевременная оптимизация думается мне, вышеупомянутый функционал сделать эффективнее для частного случая, чем в моём обобщенном примере, не удастся: сейчас компиляторы очень неплохо оптимизируют, например для 2 и 3D циклы наверняка будут развернуты. если реализовывать более сложные объекты и операции над ними, можно добиться ускорения в частном случае (например, перемножение матриц определенного вида). но опять же, оптимизацией следует заниматься только когда какое-то место становится узким. в данном случае оптимизацию, при необходимости, можно провести не меняя архитектуру, а просто добавить конкретизацию шаблона для частного случая. правильно. минусов я не вижу (по крайней мере не видя всю задачу, т.е. для чего это делается) т.е. создать себе трудности что бы потом их героически преодолевать? имхо лучше их просто не создавать... |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| djontat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 21.2.2013 Репутация: нет Всего: нет |
В случае шаблонного класса что делать с конструкторами точки? Допустим, я хочу создавать точку, сразу инициализированную координатами отличными от нуля. Как обеспечить такую возможность, учитывая, что для разных n конструктор должен иметь n параметров?
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |