Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39110708&tid=2018704]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
196ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 315ms |
| total: | 616ms |

| 0 / 0 |
