powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Матрицы, позднее связывание, и другое
72 сообщений из 72, показаны все 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
Матрицы, позднее связывание, и другое
    #39111244
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabВ Java класс может реализовать множество интерфейсов, например IDeterminableMatrix. В C++ есть множественное наследование. Только нужно правильно матрицы классифицировать.
По поводу подчёркнутого. Это тема отдельного топика. Тема интересная.
Бесконечная. И бесконечно спорная.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111580
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
По поводу подчёркнутого. Это тема отдельного топика. Тема интересная.
Бесконечная. И бесконечно спорная.

тема интересная, но хотелось бы решить хотя бы такие вопросы о которых я думаю уже несколько дней:
1. Каким будет базовый класс в данной архитектуре ?
2. Как лучше организовать то о чём я спрашивал выше ?(Как предложил Дмитрий, Илья или mcureenab или Dimitry Sibiryakov )? Честно говоря ни один вариант мне не кажется именно тем что мне нужно. Видимо то что мне нужно, это то, о чём говорил Илья, и на С++ так сделать невозможно. Если я все правильно понял.

Вывод:
Так как нет однозначно правильного решения(что странно), значит нужно что-то менять. Может быть мое пожелание не обоснованно ? Может быть нет в этом такой необходимости ?

PS
Марк, спасибо, но я так понимаю это Java, и реализация этой задачи на Java требует прежде-всего проектирование интерфейсов и немного другую специфику, которую я не смогу перенести на С++
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111613
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
сможешь.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111674
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнет однозначно правильного решения(что странно)
Ничего странного. Однозначное решение есть только для простых задач. Для сложных возможен только компромисс между расширяемостью/читаемостью/производительностью и т.д. и т.п.

Определись с кругом задач, которые будешь решать и делай как считаешь правильнее. Когда сделаешь, поэксплуатируешь, поймешь что не так, тогда напишешь версию 2.0, более правильную, но тоже не идеальную.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111675
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Каким будет базовый класс в данной архитектуре ?

Если делать как myton, то основной функцией базового класса будет обобщение любых матриц, а может быть и любых математических объектов. Чтобы было от чего cast делать. Таким образом с т.з. интерфейсов, какой то сложной иерархии классов не должно быть. Каждый объект поддерживает те или иные интерфейсы.

Классы реализации вероятно будут наследовать. Так квадратная матрица может наследовать от прямоугольной матрицы. Это делай как тебе удобно. Тут нет единственно верного решения.

В C++ мне известны два способа реализации интерфейсов.
1. Это множественное наследование от абстрактных классов-интерфейсов. Получить указатель на интерфейс можно операторами cast.
2. Встраивание реализации абстрактных классов-интерфейсов в класс реализации. Получить указатель на интерфейс можно функцией. Это не так удобно, зато класс может динамически добавлять и удалять интерфейсы.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111755
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуваки, это вам не джава какая-нибудь.
В С++ использование матриц должно выглядеть так:
Код: plaintext
1.
2.
3.
4.
matrix m1(5, 6);
matrix m2(5); // square
m1.det(); // throws
m2.det(); // ok


Ну или если в компайл-тайм ловить квадратность:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class matrix;
class square_matrix: matrix;

matrix m1(5, 6);
square_matrix m2(5);
m1.det(); // compile error
m2.det(); // ok



Какие new? Какие фабрики? )))
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39111947
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, +1
так и должно быть в С++, шаблоны рулят
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112020
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЧуваки, это вам не джава какая-нибудь.
В С++ использование матриц должно выглядеть так:
Код: plaintext
1.
2.
3.
4.
matrix m1(5, 6);
matrix m2(5); // square
m1.det(); // throws
m2.det(); // ok


Ну или если в компайл-тайм ловить квадратность:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class matrix;
class square_matrix: matrix;

matrix m1(5, 6);
square_matrix m2(5);
m1.det(); // compile error
m2.det(); // ok



Какие new? Какие фабрики? )))

Анатолий, но как сделать так, чтобы в таком коде
Код: plaintext
1.
matrix m2(5); // square


m2 имел тип square_matrix ?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112050
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryкак сделать так
Никак, обломись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112088
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryкак сделать так
Никак, обломись.


Тогда почему Анатолий так написал ?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112094
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТогда почему Анатолий так написал ?
Потому что у него класс matrix имеет два конструктора:
Код: plaintext
1.
2.
3.
4.
5.
matrix::matrix(x, y)
...
matrix::matrix(x) {
  matrix(x, x);
}


но класс один
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112125
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНикак, обломись.
Да собственно оно и не надо ))
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112130
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
2.
3.
4.
...
matrix::matrix(x) {
  matrix(x, x);
}


Страшные вещи пишете. А кто-то прочтет и потом будет думать, почему не работает ))
Не так надо вызывать конструктор из конструктора.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112150
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDimitry SibiryakovНикак, обломись.
Да собственно оно и не надо ))
Понятно. Спасибо.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112187
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryАнатолий, но как сделать так, чтобы в таком коде
Код: plaintext
1.
matrix m2(5); // square

m2 имел тип square_matrix ? m2 может в runtime поддерживать интерфейс square_matrix. это можно сделать.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112205
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще можно нарисовать cast operator .
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112239
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСтрашные вещи пишете. А кто-то прочтет и потом будет думать, почему не работает ))
Не так надо вызывать конструктор из конструктора.
Если честно - я не знал. Не приходилось на эти грабли наступать.
Затестил. Компилируется, но работает криво. Спасибо, буду знать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class Test {
private:
	int i;
public:
	Test(int v) {i = v;}
	Test(Test& v) {Test(v.i);}
	//Test(Test& v) {i = v.i;}
	void Print() {printf("%d\n", i);}
};

int main(int argc, char* argv[])
{
	Test x(1);
	Test y(x);
	x.Print();
	y.Print();
	return 0;
}

...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112286
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Можно также добавить к обсуждению библейский
спор о "количестве ангелов на кончике иглы".

О чём мы тут? Нужен юзкейс.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112362
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКоллеги. Можно также добавить к обсуждению библейский
спор о "количестве ангелов на кончике иглы".

О чём мы тут? Нужен юзкейс.

Если сам Анатолий не поленился посмеяться над моими сомнениями, то какой тут может быть юзкейс. Реализую первый вариант, предложенный Дмитрием.

PS
Когда я говорил о том что классы в целом есть в Си, мне говорили что в Си это реализовано через какие-то костыли. Теперь я говорю, не надо путать интерфейсы из Java и язык С++, мне говорят что интерфейсы это основа С++ (утрировано говоря)
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112480
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаешь, есть неплохие библиотеки для матриц написанные на сях без плюсов.

Вобщем... в погоне за лучшим можешь потерять хорошее.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112780
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗнаешь, есть неплохие библиотеки для матриц написанные на сях без плюсов.

Вобщем... в погоне за лучшим можешь потерять хорошее.

Да, знаю что есть. Ещё есть Maple и MATLAB (которых вполне хватает), просто было интересно реализовать один численный метод(я мог бы и на Си его реализовать, кстати) и посмотреть какая-будет погрешность в решении, при реализации на С++. Хотел самостоятельно спроектировать всё правильно, потому возник такой вопрос
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112782
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпросто было интересно реализовать один численный метод(я мог бы и на Си его реализовать, кстати) и посмотреть какая-будет погрешность в решении, при реализации на С++. Хотел самостоятельно спроектировать всё правильно, потому возник такой вопросКакая такая погрешность??? Саша, ты чего???
Реализация может быть удобной или не удобной, многословной или краткой. Но если ты знаешь формулы и алгоритм их использования, то какой-бы язык ты не использовал - погрешность будет всегда одинаковой. Зависящей от использованных формул и алгоритма.
Когда ж ты наконец поверишь что главное это алгоритм а не язык?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112796
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
а как же погрешность описываемая в стандарте, e: 1.0+e=1.0. Или она тоже везде будет одинакова ?
Сравню по времени в таком случае.
Я понимаю то о чём вы говорите, правда. Спасибо :)
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39112839
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

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

встроенная плавучка во всех языках делается по IEEE 754, так что да, погрешность одинакова.

я этого не знал. Зачем тогда эту информацию выносили в стандарт ? Странно
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113024
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа как же погрешность описываемая в стандарте, e: 1.0+e=1.0. Или она тоже везде будет одинакова ?
Сравню по времени в таком случае.
Я понимаю то о чём вы говорите, правда. Спасибо :)
Ты когда говоришь о т.н. "стандартах" - то уточняй о каком из них. Мы уже говорим про
стандарт на числа плавающей точности?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113672
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryа как же погрешность описываемая в стандарте, e: 1.0+e=1.0. Или она тоже везде будет одинакова ?
Сравню по времени в таком случае.
Я понимаю то о чём вы говорите, правда. Спасибо :)
Ты когда говоришь о т.н. "стандартах" - то уточняй о каком из них. Мы уже говорим про
стандарт на числа плавающей точности?

Нет, я говорю о стандарте Си, например, в котором содержится информации об той самой e:1=1+e, и другая вспомогательная информация по работе с числами двойной точности
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113675
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury Реализую первый вариант, предложенный Дмитрием.


Всё-таки этот вариант не самый хороший. Например, в базовом классе M мы определим операцию умножения матриц, но результатом такой операции может быть как прямоугольная матрица M так и квадратная S_M. Вернулся к тому что было
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113680
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фабрика - это ведь использование обычного базового абстрактного класса!
Я про это и думал когда писал топик, но не мог понять как правильно его использовать. А мне все стали про паттерны писать, и я думаю почему никто не говорит про базовый абстрактный класс в основе. Сейчас постараюсь с фабрикой разобраться, вроде-бы оно.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113686
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал так, но пока не работает.
Код: 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.
class M
{
	double* a;
	size_t n, m;
public:
	virtual int get_type() = 0;
};

class Creator
{
public:
	virtual M* factory_method() = 0;
};


class RM :public M //rectangular matrix
{
public:
	RM();
	RM(double* buf, size_t n,size_t m)
	{
		if (n == m){
			CreatorSM cr;
			M* m = cr.factory_method();//inaccessible
		}
	}
	int get_type() { return 0; }
};

class CreatorRM :public Creator
{
	M* factory_method() { return new RM(); }
};

class SM :public M //square matrix
{
	int get_type() { return 1; }
};

class CreatorSM :public Creator
{
	M* factory_method() { return new SM(); }
};



не очень красиво получается
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113692
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
float a, b, c ;
c= a+b;

превращается в вызов библиотечной функции. Которая может или следовать древним традициям sizeof(float)=sizeof(int), sizeof(double)=2*sizeof(float). Или жестко задавать 80бит для хранения любого числа с плавающей запятой и все. Но это уже достаточная редкость и надо смотреть на конкретную платформу.
А все потомки Pentium'а занимаются плавающей запятой самостоятельно. И точность расчета зависит от процессора а не собственных библиотек компилятора.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113702
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ликбез, этого я не знал.
White Owl И только тогда появилась мода на 80-и битное хранение чисел ставшая стандартом и сохраняющаяся и сегодня.

Размер long double в VS 8 байт вроде-бы, т.е. 64 бита
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113721
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправил, но всё-равно ругается
Код: 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.
class IM
{
	double* a;
	size_t n, m;
public:
	virtual int get_type() = 0;
};

class Matrix :public IM //rectangular matrix, real base class
{
public:
	Matrix();
	Matrix(double* buf, size_t n, size_t m);
	int get_type() { return 0; }
};

class SM :public IM //square matrix
{
	int get_type() { return 1; }
	int get_determinant();
};



class Creator
{
public:
	virtual IM* factory_method() = 0;
};

class CreatorRM :public Creator
{
	IM* factory_method() { return new Matrix(); }
} cRecM;

class CreatorSM :public Creator
{
	IM* factory_method() { return new SM(); }
} cSqM;

static const size_t count_of_creators = 2;

Creator* c[count_of_creators] = { &cRecM, &cSqM };

Matrix::Matrix(double* buf, size_t n, size_t m)
{
	if (n == m){
		IM* m = c[1]->factory_method();
	}
	else{
		IM* m = c[0]->factory_method();
	}
}


int main()
{
	double* temp;
	Matrix* m = new Matrix(temp, 5, 5);
	Matrix* m1 = new Matrix(temp, 5, 7);
	std::cout << m->get_type();
	std::cout << m1->get_type();
	return 0;
}



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 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113784
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
struct CreatorRM :public Creator
{
	M* factory_method() { return new RM(); }
};

и проблемы с inaccessible сразу будут решены ))
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113848
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много.
В моём текущем проекте около 14 тыс классов.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113853
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercury,
>>>struct<<< CreatorRM :public Creator
{
M* factory_method() { return new RM(); }
};

[/src]и проблемы с inaccessible сразу будут решены ))

или public: не забывать. В struct по умолчанию все члены public, а в class - private, потому недоступны.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39113860
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurySashaMercury Реализую первый вариант, предложенный Дмитрием.


Всё-таки этот вариант не самый хороший. Например, в базовом классе M мы определим операцию умножения матриц, но результатом такой операции может быть как прямоугольная матрица M так и квадратная S_M. Вернулся к тому что было
Я-бы исходил из того что говорит математика по поводу определителя для не-квадратной матрицы.
Или что говорит твой юзкейс. Например варианты поведения.

1) Бросить исключение - типа "Are you crazy man!"
2) Дать функцию isDeterminantApplyable(). Проверять возможность. И соотв. делать или не делать расчёт.
3) Обобщить прямоугольную. Например дополнить нулями и единичками (здесь
я не уверен нужно почитать возможно ли это) прямоугольную до квадратной и молча выполнить
расчёт детерминанта. Смысл разумеется возложить на постановщика.

И вот эти кейсы что я перечислил во много раз важнее дизайна классов. Как-бы нам
не хотелось красивенько унаследоваться или сделать композицию. Не стоит выпячивать ООП
фичи. Надо исходить из смыслов.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39114213
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много.
В данном случае с матрицами никаких фабрик и интерфейсов не нужно.
Если на голом месте высасывать из пальца пачки классов, то и 100 и 14000 не предел.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39115935
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychа зачем создающие функции в конкретных реализациях фабрики ты спрятал в private?
Код: plaintext
1.
2.
3.
4.
struct CreatorRM :public Creator
{
	M* factory_method() { return new RM(); }
};

и проблемы с inaccessible сразу будут решены ))

Я поправил как вы посоветовали, но это к сожалению не помогло
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39115937
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryegorych, вы как-то писали что у вас около 100 классов в одном проекте и это не много. Теперь я понимаю почему вы считаете что это не много, и почему их так много.
В моём текущем проекте около 14 тыс классов.

И из них 13 900 реализуют внутренний интерфейс и паттерны ?:)
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39117373
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonпропущено...

В моём текущем проекте около 14 тыс классов.

И из них 13 900 реализуют внутренний интерфейс и паттерны ?:)
Ммм... это хороший вопрос. Для меня даже приблизительный подсчёт
сопряжён с анализом. Так просто.... через grep code я не смогу
ответить на твой вопрос.

Но они являются частью фреймворков и соотв в обязательном порядке
имеют базовый тип.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39117379
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если бы аналогичное было бы реализовано на условной Java, какой объём по классам можно ожидать ?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39117444
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА вот если бы аналогичное было бы реализовано на условной Java, какой объём по классам можно ожидать ?
Если ты хочешь спросить - можно-ли уменьшить кол-во сущностей в принципе - то я отвечу ДА.

Но какой ценой? Ценой усложнения процесса разработки? Или введением универсальной
божественной сущности типа GodObject в котором можно добавлять и удалять поля и методы?

Или перенести половину логики в DBMS? ТОже своя цена.

Как то так вобщем.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39117464
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ моём текущем проекте около 14 тыс классовВ том смысле, что если подсчитать количество видов структур используемых API Microsoft + ... + ваших 5 структур, или как?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39117470
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012, при чём тут Microsoft? Я не использую сабж.
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39117481
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли интересно курить сорцы на Java 5.0.Java?
...
Рейтинг: 0 / 0
Матрицы, позднее связывание, и другое
    #39117517
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012, эта тема интересная. Но давай как-нибудь обсудим отдельным топиком.
В рамках "Борьбы за уменьшение количества entities"

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


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