Russian Qt Forum
Ноябрь 22, 2024, 18:18
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Шаблон треугольника
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Шаблон треугольника (Прочитано 18777 раз)
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Шаблон треугольника
«
Ответ #15 :
Июнь 16, 2016, 16:57 »
Я имею в виду следующее: у автора есть методы типа
class Triangle{
public:
...
QVector3D a() const;
...
};
Т.е класс Triangle "заточен" на работу с QVector3D. В общем случае это не годится, и вместо QVector3D придется использовать независимый от имплементации класс-враппер, типа CUniversalVector3D, который уже может быть специализирован для double & float отдельно. Это, в свою очередь, означает смену API:
class Triangle{
public:
...
CUniversalVector3D a() const;
...
};
только тогда человек сможет "безболезненно" менять имплементации векторов.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Шаблон треугольника
«
Ответ #16 :
Июнь 16, 2016, 17:09 »
Цитировать
только тогда человек сможет "безболезненно" менять имплементации векторов.
Безболезненно? Вы шутите?) То что Вы сейчас предлагаете - это антипатерн..
Это как минимум не эффективно: приводить суперкласс к частным случаям (QVector3D, arma::vec3).. И как быть с тем, что завтра мне понадобится использовать в качестве вектора /точки другой класс? (например с размерностью больше 3?) Ммм? Будете опять лезть в супервектор и добавлять новый функционал? И так до бесконечности?
Нет уж, нафиг-нафиг)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Шаблон треугольника
«
Ответ #17 :
Июнь 16, 2016, 17:15 »
Цитата: m_ax от Июнь 16, 2016, 15:58
Я имел в виду завести point_traits, где определить нужные функции и подсовывать уже его в реализацию одного шаблонного треугольника:
Элегантненько, спасибо
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Шаблон треугольника
«
Ответ #18 :
Июнь 16, 2016, 17:22 »
Racheengel, если я правильно вас понял, то сделать больше двух (и даже одного, имхо) наследников будет болью. Так и зачем нам привязка именно к QVector3D не совсем понял.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Шаблон треугольника
«
Ответ #19 :
Июнь 16, 2016, 17:53 »
m_ax, а зачем в аргументы шаблона записывать class PointTraits = point_traits<T> ?
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Шаблон треугольника
«
Ответ #20 :
Июнь 16, 2016, 17:55 »
А всё, сообразил, чтобы какой-нибудь Generic можно было вставить
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Шаблон треугольника
«
Ответ #21 :
Июнь 16, 2016, 17:59 »
Цитата: __Heaven__ от Июнь 16, 2016, 17:53
m_ax, а зачем в аргументы шаблона записывать class PointTraits = point_traits<T> ?
Если понадобится расширить класс харрактеристик (в котором еобходимо передавать более одного шаблона).. Но можно и не писать, если в этом нет необходимости..
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Шаблон треугольника
«
Ответ #22 :
Июнь 16, 2016, 22:51 »
Цитата: __Heaven__ от Июнь 16, 2016, 17:22
Racheengel, если я правильно вас понял, то сделать больше двух (и даже одного, имхо) наследников будет болью. Так и зачем нам привязка именно к QVector3D не совсем понял.
Боль будет в любом случае, поскольку изначальный класс завязан на QVector3D , с которым double не получится...
А значит, и весь код, зависящий от этого класса, придется переделать на нечто генерическое с абстрактым вектором.
Но после этого хоть 2, хоть 22 наследника можно делать - все будет более-менее одинаково. Главное API не поломать.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Шаблон треугольника
«
Ответ #23 :
Июнь 16, 2016, 22:55 »
Цитата: m_ax от Июнь 16, 2016, 17:09
Безболезненно? Вы шутите?) То что Вы сейчас предлагаете - это антипатерн..
С каких пор "фасад" стал антипаттерном? O_o
Цитата: m_ax от Июнь 16, 2016, 17:09
Это как минимум не эффективно: приводить суперкласс к частным случаям (QVector3D, arma::vec3).. И как быть с тем, что завтра мне понадобится использовать в качестве вектора /точки другой класс? (например с размерностью больше 3?) Ммм? Будете опять лезть в супервектор и добавлять новый функционал? И так до бесконечности?
Суперкласс сейчас завязан на QVector3D. Если его привести к CAbstractVector3D, то имплементаций можно ваять сколько угодно - но код, использующий CAbstractVector3D, переписывать не придется
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Шаблон треугольника
«
Ответ #24 :
Июнь 16, 2016, 23:51 »
Цитировать
С каких пор "фасад" стал антипаттерном? O_o
А я сомневаюсь, что это в данном случае именно фасад)
Ну хорошо, как Вы видите себе API абстрактного CAbstractVector3D? Как Вы его будете приводить к QVector3D, arma::vec3, MyCustomPont5D?
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Шаблон треугольника
«
Ответ #25 :
Июнь 17, 2016, 01:17 »
// Это базовый шаблон-интерфейс, в который передаем T=float/double/whatever...
template<typename T>
class IAbstractVector3D
{
public:
IAbstractVector3D(T x, T y, T z);
IAbstractVector3D GetMul(T factor) const = 0;
IAbstractVector3D GetSomethingElse(...) const = 0;
T GetX() const = 0;
T GetY() const = 0;
T GetZ() const = 0;
};
// float-имплементация на основе QVector3D
class CVector3D: public IAbstractVector3D<float>
{
public:
CVector3D(float x, float y, float z): m_vector3d(x,y,z)
{}
IAbstractVector3D GetMul(T factor) const
{
QVector3D result = m_vector3d * factor;
return CVector3D(result.x(), result.y(), result.z());
}
...
float GetX() const { return m_vector.x(); }
...
private:
QVector3D m_vector3d;
};
// double-имплементация на основе vec3
class CArmaVector3D: public IAbstractVector3D<double>
{
public:
CArmaVector3D(double x, double y, double z): m_vector3d(x,y,z)
{}
IAbstractVector3D GetMul(double factor) const
{
CArmaVector3D result = m_vector3d * factor;
return CArmaVector3D(result.x(), result.y(), result.z());
}
...
double GetX() const { return m_vector.x(); }
...
private:
arma::vec3 m_vector3d;
};
Примерно так у нас реализованы подобные классы в рабочей либе (сейчас писал по памяти, без компилятора, но в общем идея, думаю, понятна)
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Шаблон треугольника
«
Ответ #26 :
Июнь 17, 2016, 09:32 »
Зачем мне реализовывать GetMul?, если везде определён operator*, а если в какой-то экзотической либе не определён, то я могу его определить сам
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Шаблон треугольника
«
Ответ #27 :
Июнь 17, 2016, 10:03 »
Цитата: __Heaven__ от Июнь 17, 2016, 09:32
Зачем мне реализовывать GetMul?, если везде определён operator*, а если в какой-то экзотической либе не определён, то я могу его определить сам
Ну, это я для примера привел
В реальности все скорее всего решится через Find & Replace
Даже имплементация через общий интерфейс имеет недостаток того, что в вызывающем коде все равно придется менять флоты на даблы. Поэтому, любое другое решение, кроме замены, будет избыточным
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Шаблон треугольника
«
Ответ #28 :
Июнь 17, 2016, 10:36 »
Цитировать
Примерно так у нас реализованы подобные классы в рабочей либе (сейчас писал по памяти, без компилятора, но в общем идея, думаю, понятна)
Теперь понятно, спасибо)
Думаю, класс точки/вектора - это немного не тот случай, когда паттерн фассад оправдан.. Во всяком случае я не вижу никаких преимуществ в данном подходе..
Как я понимаю, пользователь сам должен выбирать удобную для него реализацию класса точки/вектора (с любой из которых сможет однообразно работать класс Triangle) а не переписывать каждый раз весь её функционал, наследуясь от абстрактного предка.
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Шаблон треугольника
«
Ответ #29 :
Июнь 17, 2016, 10:51 »
Цитата: m_ax от Июнь 17, 2016, 10:36
Во всяком случае я не вижу никаких преимуществ в данном подходе..
Да собственно, их и нет. Единственное, для чего все это городится - чтобы "встык" заменить QVector3D на нечто другое. Но проблема тут в том, что и вызывающий код придется насиловать в любом случае. Либо заменять все вызовы Triangle на IAbstractTriangle, либо переписать на шаблонах... Опять же, возникает вопрос - усилия того стоят?
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Страниц:
1
[
2
]
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...