powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Матрицы, позднее связывание, и другое
25 сообщений из 72, страница 1 из 3
Матрицы, позднее связывание, и другое
    #39110557
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Проблему с базовым классов не решил, потому пока думаю о других вещах.
Пусть например у нас есть
Код: plaintext
1.
2.
3.
4.
5.
6.
class A
{};
class B
{};
class C
{};



Здесь я намеренно не указал связи между классами, потому что не знаю какие они должны быть. Пусть один из классов матрица размером nxm, а другой квадратная матрица nxn. Какой будет третий класс пока не знаю. Все различия между ними по набору методов(и дальнейшей иерархии) очевидны. Но мне будет не удобно объявлять например так:

Код: plaintext
1.
2.
square_matrix* m1=new square_matrix(5);
rec_matrix* m2=new rec_matrix(5,7);



Очевидно удобнее будет так
Код: plaintext
1.
2.
3.
4.
matrix* m3 = new matrix(5,5);//вызов конструктора для квадратной матрицы
matrix* m4 = new matrix(5,7);//вызов конструктора для прямоугольной матрицы
m3->get_determinant();
m4->get_determinant();//error Class rec_matrix has not method get_determinant() 



Подскажите пожалуйста как правильно организовать иерархию между тремя классами, чтобы получить то что я хочу получить ? Законны ли пожелания такого рода ?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110563
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПусть один из классов матрица размером nxm, а другой квадратная матрица nxn.
Квадратная матрица частный случай прямоугольной. Я бы сделал базовым классом прямоугольную, от него унаследовать квадратную и дописать туда get_determinant()
SashaMercuryКакой будет третий класс пока не знаю.
Тогда считай что класса всего два.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110565
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо мне будет не удобно объявлять например так:
Код: plaintext
1.
2.
square_matrix* m1=new square_matrix(5);
rec_matrix* m2=new rec_matrix(5,7);


Очевидно удобнее будет так
Код: plaintext
1.
2.
3.
4.
matrix* m3 = new matrix(5,5);//вызов конструктора для квадратной матрицы
matrix* m4 = new matrix(5,7);//вызов конструктора для прямоугольной матрицы
m3->get_determinant();
m4->get_determinant();//error Class rec_matrix has not method get_determinant() 


Тут тебе решать что удобнее: получить ошибку во время компиляции (первый случай) или во время исполнения. Если разница только в одном методе, то проще в нем проверку на "квадратность" сделать и обойтись одним классом.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110570
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТут тебе решать что удобнее: получить ошибку во время компиляции (первый случай) или во время исполнения. Если разница только в одном методе, то проще в нем проверку на "квадратность" сделать и обойтись одним классом.

Дмитрий, но я хочу чтобы эти строки работали так, как я ожидаю

Код: plaintext
1.
2.
3.
4.
matrix* m3 = new matrix(5,5);//вызов конструктора для квадратной матрицы
matrix* m4 = new matrix(5,7);//вызов конструктора для прямоугольной матрицы
m3->get_determinant();//
m4->get_determinant();//ошибка должна быть только тут. Class rec_matrix has not method get_determinant() 



Прошу слишком многого ?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110576
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПрошу слишком многого ? Matrix - обертка над всякоразными матрицами.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Matrix {

  GenericMatrix *ptr;
public:
  Matrix(size_t n, size_t m) { if (n == m){ ptr = new SquareMatrix(n); } else .... }
  double get_determinant() { return ptr->get_determinant(); } ;
};



Или сделай фабрику матриц. Пусть сама разбирается, какой класс выбирать. Хотя, наверное можно все матрицы в одном классе реализовать. К чему плодить классы?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110578
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, но я хочу чтобы эти строки работали так, как я ожидаю
Код: plaintext
1.
m4->get_determinant();//ошибка должна быть только тут. Class rec_matrix has not method get_determinant() 


Для начала определить когда ты хочешь получить ошибку: во время работы или во время компиляции?
Наличие метода проверяет компилятор. Если его нет - выдаст ошибку. Во время выполнения метод будет и будет вызван, но может или вернуть ошибку или вызвать исключение.

Как понимаю: ты хочешь написать в коде
Код: plaintext
1.
matrix* m = new matrix(n,m);


Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m)
и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так?

В данном примере можно с препроцессором поизвращаться и получить нужный результат. Не уверен, но наверно можно.

Но это частный случай, т.к. конкретные значения (n,m) могут приходить извне, т.е. будут неизвестны на момент компиляции, тогда всегда будет использоваться rec_matrix
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110581
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m)
и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так?

Абсолютно верно
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110612
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima T Дальше чтобы магическим образом matrix заменился на square_matrix или rec_matrix в зависимости от значений (n,m)
и компилятор выдал ошибку при вызове get_determinant() для rec_matrix. Так?

Абсолютно верно
А теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110614
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или у тебя класс работает только для констант? Тогда можешь поиграться с шаблонами и SFINAE...
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110617
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaА теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор?

Так и должно быть. Но как это реализовать я не знаю
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110618
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab, то что вы предложили является стандартной практикой в таком случае ?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110630
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBagaBagaА теперь представь, что m и n становятся известны только во время выполнения. Что в этом случае должен делать компилятор?

Так и должно быть. Но как это реализовать я не знаю
Если значения m и n известны во время выполнения программы (скажем точнее - не известны на момент компиляции), то компилятор не сможет тебе выдать ошибку "error Class rec_matrix has not method get_determinant() " при всём желании - время выполнения "наступает" после компиляции, и тут уж компилятор не при чем.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110674
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercury,

Мы как то долго спорили на тему "круг или квадрат" (с)мультфильм

Что аж сами позапутались =)

Почитай тут http://www.sql.ru/forum/800476/vygody-kontraktnogo-programmirovaniya-design-by-contract
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110708
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Стандарт - не стандарт, но паттерн известный: Мост (шаблон проектирования)
Данном случае шаблон используется для того, чтобы выбрать подходящую реализацию матрицы.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110815
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С фабрикой может быть более логично получится, но вместо new Matrix(m,n) нужно будет дергать метод из фабрики. Как бы логически то же самое, но код другой.

Фабричный_метод_(шаблон_проектирования)

Из положительных моментов, фабрика непосредственно возвращает матрицу. При необходимости можно сделать dynamic_cast чтобы получить доступ к специфическому интерфейсу конкретной реализации.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110907
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ?
Нет никакой стандартной практики.

Есть просто совокупность качеств или удобств в разработке и развитии.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110914
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab, спасибо за совет. Но мне не очень нравится такой вариант, может быть существует другой ?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110968
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymcureenab, спасибо за совет. Но мне не очень нравится такой вариант, может быть существует другой ? на этапе компиляции нереально получить:

Код: plaintext
1.
2.
m3->get_determinant();
m4->get_determinant();//error Class rec_matrix has not method get_determinant() 



Тут:
Код: plaintext
1.
matrix* m3; matrix* m4';

компилятор не знает, почему вдруг у m3 есть get_determinant(); а у m4 его нет. Но если в runtime использовать dynamic_cast, то можно поймать попытку преобразования matrix* в square_matrix, тогда как переменная указывает на rec_matrix.

Некоторые IDE и компиляторы частично контролируют логическую правильность программы. В принципе, IDE могла бы подсказать разработчику, что dynamic_cast поднимет исключение потому как переменная указывает на несовместимый объект.

Код: plaintext
1.
2.
3.
4.
matrix* m1=new square_matrix(5);
matrix* m2=new rec_matrix(5,7);
dynamic_cast<square_matrix>(m1)->get_determinant();
dynamic_cast<square_matrix>(m2)->get_determinant();  // в мечтах warning: m2 указывает на rec_matrix. Фактически runtime error: недопустимое преобразование типа.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110970
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab, пардон. dynamic_cast<square_matrix *>...
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110990
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Очевидно удобнее будет так
Код: plaintext
1.
2.
3.
4.
matrix* m3 = new matrix(5,5);//вызов конструктора для квадратной матрицы
matrix* m4 = new matrix(5,7);//вызов конструктора для прямоугольной матрицы
m3->get_determinant();
m4->get_determinant();//error Class rec_matrix has not method get_determinant() 



Подскажите пожалуйста как правильно организовать иерархию между тремя классами, чтобы получить то что я хочу получить ? Законны ли пожелания такого рода ?

На сколько я понял, ты хочешь реализованную патерну "Виртуальный конструктор",
она делается с помощью одного из creational patterns из GoF. Например, с помощью фабрики класса.

Организация иерархии классов при этом -- совсем другой вопрос, он решается на общих основаниях.

А вот виртуальных конструкторов в С++ нет, как и во многих других языках с ООП.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110991
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не нужно отлавливать ту ошибку именно на этапе компиляции. Теперь я понял почему Дмитрий сделал на этом акцент, я этому даже не придал особого значения.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110992
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabSashaMercurymcureenab, то что вы предложили является стандартной практикой в таком случае ? Стандарт - не стандарт, но паттерн известный: Мост (шаблон проектирования)
Данном случае шаблон используется для того, чтобы выбрать подходящую реализацию матрицы.

Не, не мост. Мост будет только в реализации, и то, если это надо. Фабрика класса или Клон, или Фабричный метод.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39110996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне не нужно отлавливать ту ошибку именно на этапе компиляции.
Тогда всё просто:
Код: sql
1.
2.
3.
4.
5.
6.
matrix::get_determinant()
{
   if (x != y)
     throw "не квадратная матрица, обломись";
  ...
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111028
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы предложил так. И старуха Лисков была-бы довольна. Нету пустой имлементации расчёта детерминанта.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
interface IDeterminableMatrix{
  double getDeterminant();
}

abstract class AbstractMatrix{
 
}

class GeneralMatrix extends AbstractMatrix{

}

class SquareMatrix extends AbstractMatrix implements IDeterminableMatrix{
 
}



Саш. Чуть позже я поищу в своих сорцах.... где-то я городил целую библиотеку. У меня были read-only матрицы, тороидальные
матрицы и бесконечные...

Если интересно курить сорцы на Java 5.0.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111089
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryМне не нужно отлавливать ту ошибку именно на этапе компиляции.
Тогда всё просто:
Код: sql
1.
2.
3.
4.
5.
6.
matrix::get_determinant()
{
   if (x != y)
     throw "не квадратная матрица, обломись";
  ...
}


При таком подходе matrix должен реализовать все функции которые только могут быть у матриц. Типизация в принципе теряет смысл. Логика x!=y многократно дублируется. Если надо будет добавить новый класс матриц, заколебешся заглушки переделывать. С другой стороны не надо городить классы.


В Java класс может реализовать множество интерфейсов, например IDeterminableMatrix. В C++ есть множественное наследование. Только нужно правильно матрицы классифицировать.
...
Рейтинг: 0 / 0
25 сообщений из 72, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Матрицы, позднее связывание, и другое
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]