Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
23.11.2015, 07:30
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
Здравствуйте. Проблему с базовым классов не решил, потому пока думаю о других вещах. Пусть например у нас есть Код: plaintext 1. 2. 3. 4. 5. 6. Здесь я намеренно не указал связи между классами, потому что не знаю какие они должны быть. Пусть один из классов матрица размером nxm, а другой квадратная матрица nxn. Какой будет третий класс пока не знаю. Все различия между ними по набору методов(и дальнейшей иерархии) очевидны. Но мне будет не удобно объявлять например так: Код: plaintext 1. 2. Очевидно удобнее будет так Код: plaintext 1. 2. 3. 4. Подскажите пожалуйста как правильно организовать иерархию между тремя классами, чтобы получить то что я хочу получить ? Законны ли пожелания такого рода ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 07:58
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercuryПусть один из классов матрица размером nxm, а другой квадратная матрица nxn. Квадратная матрица частный случай прямоугольной. Я бы сделал базовым классом прямоугольную, от него унаследовать квадратную и дописать туда get_determinant() SashaMercuryКакой будет третий класс пока не знаю. Тогда считай что класса всего два. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 08:04
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercuryНо мне будет не удобно объявлять например так: Код: plaintext 1. 2. Очевидно удобнее будет так Код: plaintext 1. 2. 3. 4. Тут тебе решать что удобнее: получить ошибку во время компиляции (первый случай) или во время исполнения. Если разница только в одном методе, то проще в нем проверку на "квадратность" сделать и обойтись одним классом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 08:25
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
Dima TТут тебе решать что удобнее: получить ошибку во время компиляции (первый случай) или во время исполнения. Если разница только в одном методе, то проще в нем проверку на "квадратность" сделать и обойтись одним классом. Дмитрий, но я хочу чтобы эти строки работали так, как я ожидаю Код: plaintext 1. 2. 3. 4. Прошу слишком многого ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 08:49
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercuryПрошу слишком многого ? Matrix - обертка над всякоразными матрицами. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Или сделай фабрику матриц. Пусть сама разбирается, какой класс выбирать. Хотя, наверное можно все матрицы в одном классе реализовать. К чему плодить классы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 09:04
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#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:09
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
Dima T Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m) и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так? Абсолютно верно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 09:54
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercuryDima T Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m) и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так? Абсолютно верно А теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 09:56
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
Или у тебя класс работает только для констант? Тогда можешь поиграться с шаблонами и SFINAE... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 09:59
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
BagaBagaА теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор? Так и должно быть. Но как это реализовать я не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 10:01
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
mcureenab, то что вы предложили является стандартной практикой в таком случае ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 10:19
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercuryBagaBagaА теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор? Так и должно быть. Но как это реализовать я не знаю Если значения m и n известны во время выполнения программы (скажем точнее - не известны на момент компиляции), то компилятор не сможет тебе выдать ошибку "error Class rec_matrix has not method get_determinant() " при всём желании - время выполнения "наступает" после компиляции, и тут уж компилятор не при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 10:55
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercury, Мы как то долго спорили на тему "круг или квадрат" (с)мультфильм Что аж сами позапутались =) Почитай тут http://www.sql.ru/forum/800476/vygody-kontraktnogo-programmirovaniya-design-by-contract ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 11:10
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Стандарт - не стандарт, но паттерн известный: Мост (шаблон проектирования) Данном случае шаблон используется для того, чтобы выбрать подходящую реализацию матрицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 12:16
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
С фабрикой может быть более логично получится, но вместо new Matrix(m,n) нужно будет дергать метод из фабрики. Как бы логически то же самое, но код другой. Фабричный_метод_(шаблон_проектирования) Из положительных моментов, фабрика непосредственно возвращает матрицу. При необходимости можно сделать dynamic_cast чтобы получить доступ к специфическому интерфейсу конкретной реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 13:22
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Нет никакой стандартной практики. Есть просто совокупность качеств или удобств в разработке и развитии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 13:25
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
mcureenab, спасибо за совет. Но мне не очень нравится такой вариант, может быть существует другой ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 14:08
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#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:09
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
mcureenab, пардон. dynamic_cast<square_matrix *>... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 14:19
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercury Очевидно удобнее будет так Код: plaintext 1. 2. 3. 4. Подскажите пожалуйста как правильно организовать иерархию между тремя классами, чтобы получить то что я хочу получить ? Законны ли пожелания такого рода ? На сколько я понял, ты хочешь реализованную патерну "Виртуальный конструктор", она делается с помощью одного из creational patterns из GoF. Например, с помощью фабрики класса. Организация иерархии классов при этом -- совсем другой вопрос, он решается на общих основаниях. А вот виртуальных конструкторов в С++ нет, как и во многих других языках с ООП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 14:20
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
Мне не нужно отлавливать ту ошибку именно на этапе компиляции. Теперь я понял почему Дмитрий сделал на этом акцент, я этому даже не придал особого значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 14:21
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
mcureenabSashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Стандарт - не стандарт, но паттерн известный: Мост (шаблон проектирования) Данном случае шаблон используется для того, чтобы выбрать подходящую реализацию матрицы. Не, не мост. Мост будет только в реализации, и то, если это надо. Фабрика класса или Клон, или Фабричный метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 14:25
|
|||
|---|---|---|---|
|
|||
Матрицы, позднее связывание, и другое |
|||
|
#18+
SashaMercuryМне не нужно отлавливать ту ошибку именно на этапе компиляции. Тогда всё просто: Код: sql 1. 2. 3. 4. 5. 6. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 14:40
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#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, 15:11
|
|||
|---|---|---|---|
Матрицы, позднее связывание, и другое |
|||
|
#18+
Dimitry SibiryakovSashaMercuryМне не нужно отлавливать ту ошибку именно на этапе компиляции. Тогда всё просто: Код: sql 1. 2. 3. 4. 5. 6. При таком подходе matrix должен реализовать все функции которые только могут быть у матриц. Типизация в принципе теряет смысл. Логика x!=y многократно дублируется. Если надо будет добавить новый класс матриц, заколебешся заглушки переделывать. С другой стороны не надо городить классы. В Java класс может реализовать множество интерфейсов, например IDeterminableMatrix. В C++ есть множественное наследование. Только нужно правильно матрицы классифицировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2018704]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 184ms |

| 0 / 0 |
