Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Проблему с базовым классов не решил, потому пока думаю о других вещах. Пусть например у нас есть Код: plaintext 1. 2. 3. 4. 5. 6. Здесь я намеренно не указал связи между классами, потому что не знаю какие они должны быть. Пусть один из классов матрица размером nxm, а другой квадратная матрица nxn. Какой будет третий класс пока не знаю. Все различия между ними по набору методов(и дальнейшей иерархии) очевидны. Но мне будет не удобно объявлять например так: Код: plaintext 1. 2. Очевидно удобнее будет так Код: plaintext 1. 2. 3. 4. Подскажите пожалуйста как правильно организовать иерархию между тремя классами, чтобы получить то что я хочу получить ? Законны ли пожелания такого рода ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 07:30 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПусть один из классов матрица размером nxm, а другой квадратная матрица nxn. Квадратная матрица частный случай прямоугольной. Я бы сделал базовым классом прямоугольную, от него унаследовать квадратную и дописать туда get_determinant() SashaMercuryКакой будет третий класс пока не знаю. Тогда считай что класса всего два. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 07:58 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНо мне будет не удобно объявлять например так: Код: plaintext 1. 2. Очевидно удобнее будет так Код: plaintext 1. 2. 3. 4. Тут тебе решать что удобнее: получить ошибку во время компиляции (первый случай) или во время исполнения. Если разница только в одном методе, то проще в нем проверку на "квадратность" сделать и обойтись одним классом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 08:04 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Dima TТут тебе решать что удобнее: получить ошибку во время компиляции (первый случай) или во время исполнения. Если разница только в одном методе, то проще в нем проверку на "квадратность" сделать и обойтись одним классом. Дмитрий, но я хочу чтобы эти строки работали так, как я ожидаю Код: plaintext 1. 2. 3. 4. Прошу слишком многого ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 08:25 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПрошу слишком многого ? Matrix - обертка над всякоразными матрицами. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Или сделай фабрику матриц. Пусть сама разбирается, какой класс выбирать. Хотя, наверное можно все матрицы в одном классе реализовать. К чему плодить классы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 08:49 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryДмитрий, но я хочу чтобы эти строки работали так, как я ожидаю Код: plaintext 1. Для начала определить когда ты хочешь получить ошибку: во время работы или во время компиляции? Наличие метода проверяет компилятор. Если его нет - выдаст ошибку. Во время выполнения метод будет и будет вызван, но может или вернуть ошибку или вызвать исключение. Как понимаю: ты хочешь написать в коде Код: plaintext 1. Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m) и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так? В данном примере можно с препроцессором поизвращаться и получить нужный результат. Не уверен, но наверно можно. Но это частный случай, т.к. конкретные значения (n,m) могут приходить извне, т.е. будут неизвестны на момент компиляции, тогда всегда будет использоваться rec_matrix ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 09:04 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Dima T Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m) и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так? Абсолютно верно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 09:09 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryDima T Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m) и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так? Абсолютно верно А теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 09:54 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Или у тебя класс работает только для констант? Тогда можешь поиграться с шаблонами и SFINAE... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 09:56 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
BagaBagaА теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор? Так и должно быть. Но как это реализовать я не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 09:59 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
mcureenab, то что вы предложили является стандартной практикой в таком случае ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 10:01 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryBagaBagaА теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор? Так и должно быть. Но как это реализовать я не знаю Если значения m и n известны во время выполнения программы (скажем точнее - не известны на момент компиляции), то компилятор не сможет тебе выдать ошибку "error Class rec_matrix has not method get_determinant() " при всём желании - время выполнения "наступает" после компиляции, и тут уж компилятор не при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 10:19 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Мы как то долго спорили на тему "круг или квадрат" (с)мультфильм Что аж сами позапутались =) Почитай тут http://www.sql.ru/forum/800476/vygody-kontraktnogo-programmirovaniya-design-by-contract ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 10:55 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Стандарт - не стандарт, но паттерн известный: Мост (шаблон проектирования) Данном случае шаблон используется для того, чтобы выбрать подходящую реализацию матрицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 11:10 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
С фабрикой может быть более логично получится, но вместо new Matrix(m,n) нужно будет дергать метод из фабрики. Как бы логически то же самое, но код другой. Фабричный_метод_(шаблон_проектирования) Из положительных моментов, фабрика непосредственно возвращает матрицу. При необходимости можно сделать dynamic_cast чтобы получить доступ к специфическому интерфейсу конкретной реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 12:16 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Нет никакой стандартной практики. Есть просто совокупность качеств или удобств в разработке и развитии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 13:22 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
mcureenab, спасибо за совет. Но мне не очень нравится такой вариант, может быть существует другой ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 13:25 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercurymcureenab, спасибо за совет. Но мне не очень нравится такой вариант, может быть существует другой ? на этапе компиляции нереально получить: Код: plaintext 1. 2. Тут: Код: plaintext 1. компилятор не знает, почему вдруг у m3 есть get_determinant(); а у m4 его нет. Но если в runtime использовать dynamic_cast, то можно поймать попытку преобразования matrix* в square_matrix, тогда как переменная указывает на rec_matrix. Некоторые IDE и компиляторы частично контролируют логическую правильность программы. В принципе, IDE могла бы подсказать разработчику, что dynamic_cast поднимет исключение потому как переменная указывает на несовместимый объект. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 14:08 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
mcureenab, пардон. dynamic_cast<square_matrix *>... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 14:09 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercury Очевидно удобнее будет так Код: plaintext 1. 2. 3. 4. Подскажите пожалуйста как правильно организовать иерархию между тремя классами, чтобы получить то что я хочу получить ? Законны ли пожелания такого рода ? На сколько я понял, ты хочешь реализованную патерну "Виртуальный конструктор", она делается с помощью одного из creational patterns из GoF. Например, с помощью фабрики класса. Организация иерархии классов при этом -- совсем другой вопрос, он решается на общих основаниях. А вот виртуальных конструкторов в С++ нет, как и во многих других языках с ООП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 14:19 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Мне не нужно отлавливать ту ошибку именно на этапе компиляции. Теперь я понял почему Дмитрий сделал на этом акцент, я этому даже не придал особого значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 14:20 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
mcureenabSashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Стандарт - не стандарт, но паттерн известный: Мост (шаблон проектирования) Данном случае шаблон используется для того, чтобы выбрать подходящую реализацию матрицы. Не, не мост. Мост будет только в реализации, и то, если это надо. Фабрика класса или Клон, или Фабричный метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 14:21 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryМне не нужно отлавливать ту ошибку именно на этапе компиляции. Тогда всё просто: Код: sql 1. 2. 3. 4. 5. 6. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 14:25 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Я-бы предложил так. И старуха Лисков была-бы довольна. Нету пустой имлементации расчёта детерминанта. Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Саш. Чуть позже я поищу в своих сорцах.... где-то я городил целую библиотеку. У меня были read-only матрицы, тороидальные матрицы и бесконечные... Если интересно курить сорцы на Java 5.0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 14:40 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovSashaMercuryМне не нужно отлавливать ту ошибку именно на этапе компиляции. Тогда всё просто: Код: sql 1. 2. 3. 4. 5. 6. При таком подходе matrix должен реализовать все функции которые только могут быть у матриц. Типизация в принципе теряет смысл. Логика x!=y многократно дублируется. Если надо будет добавить новый класс матриц, заколебешся заглушки переделывать. С другой стороны не надо городить классы. В Java класс может реализовать множество интерфейсов, например IDeterminableMatrix. В C++ есть множественное наследование. Только нужно правильно матрицы классифицировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 15:11 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
mcureenabВ Java класс может реализовать множество интерфейсов, например IDeterminableMatrix. В C++ есть множественное наследование. Только нужно правильно матрицы классифицировать. По поводу подчёркнутого. Это тема отдельного топика. Тема интересная. Бесконечная. И бесконечно спорная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2015, 16:42 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
mayton По поводу подчёркнутого. Это тема отдельного топика. Тема интересная. Бесконечная. И бесконечно спорная. тема интересная, но хотелось бы решить хотя бы такие вопросы о которых я думаю уже несколько дней: 1. Каким будет базовый класс в данной архитектуре ? 2. Как лучше организовать то о чём я спрашивал выше ?(Как предложил Дмитрий, Илья или mcureenab или Dimitry Sibiryakov )? Честно говоря ни один вариант мне не кажется именно тем что мне нужно. Видимо то что мне нужно, это то, о чём говорил Илья, и на С++ так сделать невозможно. Если я все правильно понял. Вывод: Так как нет однозначно правильного решения(что странно), значит нужно что-то менять. Может быть мое пожелание не обоснованно ? Может быть нет в этом такой необходимости ? PS Марк, спасибо, но я так понимаю это Java, и реализация этой задачи на Java требует прежде-всего проектирование интерфейсов и немного другую специфику, которую я не смогу перенести на С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 01:58 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercury, сможешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 07:34 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryнет однозначно правильного решения(что странно) Ничего странного. Однозначное решение есть только для простых задач. Для сложных возможен только компромисс между расширяемостью/читаемостью/производительностью и т.д. и т.п. Определись с кругом задач, которые будешь решать и делай как считаешь правильнее. Когда сделаешь, поэксплуатируешь, поймешь что не так, тогда напишешь версию 2.0, более правильную, но тоже не идеальную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 09:21 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercury1. Каким будет базовый класс в данной архитектуре ? Если делать как myton, то основной функцией базового класса будет обобщение любых матриц, а может быть и любых математических объектов. Чтобы было от чего cast делать. Таким образом с т.з. интерфейсов, какой то сложной иерархии классов не должно быть. Каждый объект поддерживает те или иные интерфейсы. Классы реализации вероятно будут наследовать. Так квадратная матрица может наследовать от прямоугольной матрицы. Это делай как тебе удобно. Тут нет единственно верного решения. В C++ мне известны два способа реализации интерфейсов. 1. Это множественное наследование от абстрактных классов-интерфейсов. Получить указатель на интерфейс можно операторами cast. 2. Встраивание реализации абстрактных классов-интерфейсов в класс реализации. Получить указатель на интерфейс можно функцией. Это не так удобно, зато класс может динамически добавлять и удалять интерфейсы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 09:21 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Чуваки, это вам не джава какая-нибудь. В С++ использование матриц должно выглядеть так: Код: plaintext 1. 2. 3. 4. Ну или если в компайл-тайм ловить квадратность: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Какие new? Какие фабрики? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 10:15 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, +1 так и должно быть в С++, шаблоны рулят ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 12:15 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЧуваки, это вам не джава какая-нибудь. В С++ использование матриц должно выглядеть так: Код: plaintext 1. 2. 3. 4. Ну или если в компайл-тайм ловить квадратность: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Какие new? Какие фабрики? ))) Анатолий, но как сделать так, чтобы в таком коде Код: plaintext 1. m2 имел тип square_matrix ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:11 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryкак сделать так Никак, обломись. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:30 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovSashaMercuryкак сделать так Никак, обломись. Тогда почему Анатолий так написал ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:52 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryТогда почему Анатолий так написал ? Потому что у него класс matrix имеет два конструктора: Код: plaintext 1. 2. 3. 4. 5. но класс один ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:59 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНикак, обломись. Да собственно оно и не надо )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 14:13 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Dima T Код: plaintext 1. 2. 3. 4. Страшные вещи пишете. А кто-то прочтет и потом будет думать, почему не работает )) Не так надо вызывать конструктор из конструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 14:15 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyDimitry SibiryakovНикак, обломись. Да собственно оно и не надо )) Понятно. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 14:30 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryАнатолий, но как сделать так, чтобы в таком коде Код: plaintext 1. m2 имел тип square_matrix ? m2 может в runtime поддерживать интерфейс square_matrix. это можно сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 14:52 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
еще можно нарисовать cast operator . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 15:03 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСтрашные вещи пишете. А кто-то прочтет и потом будет думать, почему не работает )) Не так надо вызывать конструктор из конструктора. Если честно - я не знал. Не приходилось на эти грабли наступать. Затестил. Компилируется, но работает криво. Спасибо, буду знать. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 15:17 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Коллеги. Можно также добавить к обсуждению библейский спор о "количестве ангелов на кончике иглы". О чём мы тут? Нужен юзкейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 15:36 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
maytonКоллеги. Можно также добавить к обсуждению библейский спор о "количестве ангелов на кончике иглы". О чём мы тут? Нужен юзкейс. Если сам Анатолий не поленился посмеяться над моими сомнениями, то какой тут может быть юзкейс. Реализую первый вариант, предложенный Дмитрием. PS Когда я говорил о том что классы в целом есть в Си, мне говорили что в Си это реализовано через какие-то костыли. Теперь я говорю, не надо путать интерфейсы из Java и язык С++, мне говорят что интерфейсы это основа С++ (утрировано говоря) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 16:21 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Знаешь, есть неплохие библиотеки для матриц написанные на сях без плюсов. Вобщем... в погоне за лучшим можешь потерять хорошее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 17:33 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
maytonЗнаешь, есть неплохие библиотеки для матриц написанные на сях без плюсов. Вобщем... в погоне за лучшим можешь потерять хорошее. Да, знаю что есть. Ещё есть Maple и MATLAB (которых вполне хватает), просто было интересно реализовать один численный метод(я мог бы и на Си его реализовать, кстати) и посмотреть какая-будет погрешность в решении, при реализации на С++. Хотел самостоятельно спроектировать всё правильно, потому возник такой вопрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 01:44 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryпросто было интересно реализовать один численный метод(я мог бы и на Си его реализовать, кстати) и посмотреть какая-будет погрешность в решении, при реализации на С++. Хотел самостоятельно спроектировать всё правильно, потому возник такой вопросКакая такая погрешность??? Саша, ты чего??? Реализация может быть удобной или не удобной, многословной или краткой. Но если ты знаешь формулы и алгоритм их использования, то какой-бы язык ты не использовал - погрешность будет всегда одинаковой. Зависящей от использованных формул и алгоритма. Когда ж ты наконец поверишь что главное это алгоритм а не язык? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 02:09 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
White Owl, а как же погрешность описываемая в стандарте, e: 1.0+e=1.0. Или она тоже везде будет одинакова ? Сравню по времени в таком случае. Я понимаю то о чём вы говорите, правда. Спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 06:06 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercury, встроенная плавучка во всех языках делается по IEEE 754, так что да, погрешность одинакова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 09:25 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
RWolfSashaMercury, встроенная плавучка во всех языках делается по IEEE 754, так что да, погрешность одинакова. я этого не знал. Зачем тогда эту информацию выносили в стандарт ? Странно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 10:05 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryа как же погрешность описываемая в стандарте, e: 1.0+e=1.0. Или она тоже везде будет одинакова ? Сравню по времени в таком случае. Я понимаю то о чём вы говорите, правда. Спасибо :) Ты когда говоришь о т.н. "стандартах" - то уточняй о каком из них. Мы уже говорим про стандарт на числа плавающей точности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 12:38 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
maytonSashaMercuryа как же погрешность описываемая в стандарте, e: 1.0+e=1.0. Или она тоже везде будет одинакова ? Сравню по времени в таком случае. Я понимаю то о чём вы говорите, правда. Спасибо :) Ты когда говоришь о т.н. "стандартах" - то уточняй о каком из них. Мы уже говорим про стандарт на числа плавающей точности? Нет, я говорю о стандарте Си, например, в котором содержится информации об той самой e:1=1+e, и другая вспомогательная информация по работе с числами двойной точности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 01:42 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercury Реализую первый вариант, предложенный Дмитрием. Всё-таки этот вариант не самый хороший. Например, в базовом классе M мы определим операцию умножения матриц, но результатом такой операции может быть как прямоугольная матрица M так и квадратная S_M. Вернулся к тому что было ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 01:44 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Фабрика - это ведь использование обычного базового абстрактного класса! Я про это и думал когда писал топик, но не мог понять как правильно его использовать. А мне все стали про паттерны писать, и я думаю почему никто не говорит про базовый абстрактный класс в основе. Сейчас постараюсь с фабрикой разобраться, вроде-бы оно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 02:22 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Сделал так, но пока не работает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. не очень красиво получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 03:31 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercurymaytonпропущено... Ты когда говоришь о т.н. "стандартах" - то уточняй о каком из них. Мы уже говорим про стандарт на числа плавающей точности? Нет, я говорю о стандарте Си, например, в котором содержится информации об той самой e:1=1+e, и другая вспомогательная информация по работе с числами двойной точностиА для понимания этого момента, надо учить историю. В далекие и древние времена, очень редкие компьютеры умели считать числа с плавающей запятой самостоятельно. Для таких расчетов использовались специальные программы, которые были оформлены в виде функций для библиотек. И так как эти расчеты были нужны достаточно часто, то эти функции появлялись в составе всех имеющихся компиляторов. И в итоге их решили считать стандартными. В те времена тип float занимал в памяти столько же байт сколько тип int (какого-бы размера int) ни был на конкретной платформе. А double соответственно вдвое длиннее. Ну вот так Ричи захотелось... И отсюда и возникла "стандартная" точность для float и double. Как работала вся математика для плавающей точки? Через численные методы и схождение рядов. Ну и чтобы добавить порядка, ввели в стандарт ограничения по точности и создатели компиляторов исходя из этой точности задавали сколько итераций делать при расчете всех операций с float и double переменными (и арифметических и тригонометрических и всех остальных -ических). А потом настал 1980-ый год и Intel выпустил в свободную продажу специальный процессор i8087 который ставился в пару к i8086 и занимался исключительно числами с плавающей запятой. И все номерные процессоры семейства (i8086, i80186, i80286, i80386 и i80486 со всеми кузенами и модификациями) имели младших братишек с семеркой в конце номера. В результате, в 80-х и 90-х годах все компиляторы Си и С++ имели специальный ключик - отдавать все операции с float и double в сопроцессор или использовать собственную библиотеку... Причем что интересно, стандарт на компьютерную обработку чисел с плавающей запятой уже писался на основе x87-ого чипа. Сначала Intel выпустил 8087-ой сопроцессор, а стандарт который описывает как эти расчеты надо было проводить вышел на пять лет позже... И только тогда появилась мода на 80-и битное хранение чисел ставшая стандартом и сохраняющаяся и сегодня. Стандарт по формальной математик по существу писался с оглядкой на уже существующее коммерческое решение в железе. А когда Intel выпустил Pentium, то операции с плавающей точкой в конце-концов втянули внутрь главного чипа и эпоха сопроцессоров закончилась. С тех пор компиляторы перестали тащить за собой специальные библиотеки для работы с плавающей запятой и стали сразу отдавать эти расчеты в процессор. И теперь за точность расчетов уже отвечает не язык, а процессор. Кстати, в GNU C/C++ до сих пор есть опция -msoft-float и -mfpmath которыми можно выключить использование команд процессора для расчетов и заменить их вызовами функций (которая уже не поставляется с компилятором). А на многих микроконтроллерах соответсвующих операций до сих пор нет и там по прежнему программа типа: Код: plaintext 1. 2. превращается в вызов библиотечной функции. Которая может или следовать древним традициям sizeof(float)=sizeof(int), sizeof(double)=2*sizeof(float). Или жестко задавать 80бит для хранения любого числа с плавающей запятой и все. Но это уже достаточная редкость и надо смотреть на конкретную платформу. А все потомки Pentium'а занимаются плавающей запятой самостоятельно. И точность расчета зависит от процессора а не собственных библиотек компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 05:32 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Спасибо за ликбез, этого я не знал. White Owl И только тогда появилась мода на 80-и битное хранение чисел ставшая стандартом и сохраняющаяся и сегодня. Размер long double в VS 8 байт вроде-бы, т.е. 64 бита ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 07:13 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Поправил, но всё-равно ругается Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. Error 2 error LNK2019: unresolved external symbol "public: __thiscall Matrix::Matrix(void)" (??0Matrix@@QAE@XZ) referenced in function "private: virtual class IM * __thiscall CreatorRM::factory_method(void)" (?factory_method@CreatorRM@@EAEPAVIM@@XZ PS egorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 09:00 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercury, >>Поправил, но всё-равно ругается Error 2 error LNK2019: unresolved external symbol "public: __thiscall Matrix::Matrix(void)" (??0Matrix@@QAE@XZ) referenced in function "private: virtual class IM * __thiscall CreatorRM::factory_method(void)" (?factory_method@CreatorRM@@EAEPAVIM@@XZ ну, а дефолтный конструктор у класса Matrix кто будет реализовывать? )) >>egorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много. :) а зачем создающие функции в конкретных реализациях фабрики ты спрятал в private? Код: plaintext 1. 2. 3. 4. и проблемы с inaccessible сразу будут решены )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 10:20 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryegorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много. В моём текущем проекте около 14 тыс классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 11:38 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
egorychSashaMercury, >>>struct<<< CreatorRM :public Creator { M* factory_method() { return new RM(); } }; [/src]и проблемы с inaccessible сразу будут решены )) или public: не забывать. В struct по умолчанию все члены public, а в class - private, потому недоступны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 11:41 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercurySashaMercury Реализую первый вариант, предложенный Дмитрием. Всё-таки этот вариант не самый хороший. Например, в базовом классе M мы определим операцию умножения матриц, но результатом такой операции может быть как прямоугольная матрица M так и квадратная S_M. Вернулся к тому что было Я-бы исходил из того что говорит математика по поводу определителя для не-квадратной матрицы. Или что говорит твой юзкейс. Например варианты поведения. 1) Бросить исключение - типа "Are you crazy man!" 2) Дать функцию isDeterminantApplyable(). Проверять возможность. И соотв. делать или не делать расчёт. 3) Обобщить прямоугольную. Например дополнить нулями и единичками (здесь я не уверен нужно почитать возможно ли это) прямоугольную до квадратной и молча выполнить расчёт детерминанта. Смысл разумеется возложить на постановщика. И вот эти кейсы что я перечислил во много раз важнее дизайна классов. Как-бы нам не хотелось красивенько унаследоваться или сделать композицию. Не стоит выпячивать ООП фичи. Надо исходить из смыслов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 11:45 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryegorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много. В данном случае с матрицами никаких фабрик и интерфейсов не нужно. Если на голом месте высасывать из пальца пачки классов, то и 100 и 14000 не предел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 16:32 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
egorychа зачем создающие функции в конкретных реализациях фабрики ты спрятал в private? Код: plaintext 1. 2. 3. 4. и проблемы с inaccessible сразу будут решены )) Я поправил как вы посоветовали, но это к сожалению не помогло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2015, 01:59 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
maytonSashaMercuryegorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много. В моём текущем проекте около 14 тыс классов. И из них 13 900 реализуют внутренний интерфейс и паттерны ?:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2015, 02:01 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercurymaytonпропущено... В моём текущем проекте около 14 тыс классов. И из них 13 900 реализуют внутренний интерфейс и паттерны ?:) Ммм... это хороший вопрос. Для меня даже приблизительный подсчёт сопряжён с анализом. Так просто.... через grep code я не смогу ответить на твой вопрос. Но они являются частью фреймворков и соотв в обязательном порядке имеют базовый тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 14:38 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
А вот если бы аналогичное было бы реализовано на условной Java, какой объём по классам можно ожидать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 14:42 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
SashaMercuryА вот если бы аналогичное было бы реализовано на условной Java, какой объём по классам можно ожидать ? Если ты хочешь спросить - можно-ли уменьшить кол-во сущностей в принципе - то я отвечу ДА. Но какой ценой? Ценой усложнения процесса разработки? Или введением универсальной божественной сущности типа GodObject в котором можно добавлять и удалять поля и методы? Или перенести половину логики в DBMS? ТОже своя цена. Как то так вобщем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:25 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
maytonВ моём текущем проекте около 14 тыс классовВ том смысле, что если подсчитать количество видов структур используемых API Microsoft + ... + ваших 5 структур, или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:34 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
Владимир2012, при чём тут Microsoft? Я не использую сабж. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:41 |
|
||
|
Матрицы, позднее связывание, и другое
|
|||
|---|---|---|---|
|
#18+
maytonЕсли интересно курить сорцы на Java 5.0.Java? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:47 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018704]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
1ms |
| others: | 281ms |
| total: | 550ms |

| 0 / 0 |
