Форум программистов, компьютерный форум CyberForum.ru

Матрица, перегрузка операторов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.70
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
24.06.2011, 17:00     Матрица, перегрузка операторов #1
Дня доброго.
Есть такая вот задачка:
24.02.Создать класс для работы с матрицами. Предусмотреть, как минимум, функции для сложения матриц,
умножения матриц, транспонирования матриц, присваивания матриц друг другу, установка и получение
произвольного элемента матрицы. Необходимо перегрузить соответствующие операторы
есть вот такой класс
C++
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
#include<iostream>
using namespace std;
class matrix
{
private:
    int x,y;
    int **m;
public:
    matrix()
    {
        **m=NULL;
        x=0;
        y=0;
    }
    matrix(int xx,int yy)
    {
        x=xx;
        y=yy;
        m=new int *[y];
        for(int i=0;i<y;i++)
            *(m+i)=new int[x];
    }
    matrix(int **q,int xx,int yy)
    {
        x=xx;
        y=yy;
        m=new int *[y];
        for(int i=0;i<y;i++)
            *(m+i)=new int[x];
        for(int i=0;i<y;i++)
            for(int j=0;j<0;j++)
                m[j][i]=q[j][i];
    }
    ~matrix()
    {
        for(int i=0;i<y;i++)
            delete []*(m+i);
        delete []m;
    }
};
int main()
{
    setlocale(LC_ALL,"Russian");
    return EXIT_SUCCESS;
}
Есть проблема: перегрузить [][].Упарился искать решение, пишут что можно сделать 2-й класс внутри первого - типа строки, и в перегрузке[] 1-го класса вызывать перегрузку [] 2-го класса.
Но как факт ни... ничего не понял.
кто сталкивался просветите, буду благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 17:00     Матрица, перегрузка операторов
Посмотрите здесь:

C++ перегрузка операторов C++
Перегрузка операторов C++
Класс матрица. Контструктор, деструктор и перегрузка операторов. C++
перегрузка операторов C++
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.06.2011, 17:04     Матрица, перегрузка операторов #2
почему бы не сделать
int* operator[](index);
тогда можно будет писать mtrx[][] ты же этого хочешь?
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
24.06.2011, 17:08  [ТС]     Матрица, перегрузка операторов #3
еп.... получиццо matrix[] замениццо на адрес строки, а вторые [] станут номером элемента в строке...
гм... сча попробую
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.06.2011, 17:10     Матрица, перегрузка операторов #4
Цитата Сообщение от LineStown Посмотреть сообщение
**m=NULL;
интересная строка, ты зачем то обNULLяешь первый элемент своей матрицы, хотя скорее всего ты хотел занулить указатель?

конструктор копирования нужен будет
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.06.2011, 17:13     Матрица, перегрузка операторов #5
LineStown, я бы написал дополнительный класс Row, в котором перегрузил бы operator[]. В матрице же хранил бы массив экземпляров класса Row, а оператор [] в матрице возвращал бы один из элементов этого массива. Тогда вторая операция [] применялась бы к Row и мы получали бы определённый элемент. Да и с самой матрицей удобнее работать, когда работа со строками вынесена в отдельный класс.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
24.06.2011, 17:16  [ТС]     Матрица, перегрузка операторов #6
Вот терь дошло) спасибо товарищи.

Добавлено через 47 секунд
1-й способ прокатил, сча с классом строк попробую
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.06.2011, 17:22     Матрица, перегрузка операторов #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
В матрице же хранил бы массив экземпляров класса Row
я бы лучше наследовал от vector<vector<type> >
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
24.06.2011, 17:24  [ТС]     Матрица, перегрузка операторов #8
Цитата Сообщение от sandye51 Посмотреть сообщение
я бы лучше наследовал от vector<vector<type> >
Можеть бы и так сделал, но про вектор ещё не разбирался)
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.06.2011, 17:25     Матрица, перегрузка операторов #9
да тебе бы лишь чё нибудь унаследовать, то квадрат из точки, то матрицу из стловских векторов. Это же ужас как неэффективно - каждай строка матрицы хранит свой размер и ёмкость. Зачем?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.06.2011, 17:27     Матрица, перегрузка операторов #10
sandye51, речь шла, как я понял, о полностью своей реализации, с использованием только сырых типов))

Не по теме:

А ведь хотел же про вектор написать после пояснения про Row, так нет же, забыл!))

LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
24.06.2011, 17:29  [ТС]     Матрица, перегрузка операторов #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
речь шла, как я понял, о полностью своей реализации, с использованием только сырых типов))
Совершенно верно, решить нужно используя только базовые типы
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.06.2011, 17:29     Матрица, перегрузка операторов #12
pito211, в реализации Row я бы тоже хранил размер и ёмкость, так что разницы нет. но вектор эффективен.
А про наследование речи не было, разве что про композицию
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.06.2011, 17:30     Матрица, перегрузка операторов #13
почему от stl? вектор можно и свой написать.

pito211,
наверно те, кто stl писали поумнее тебя, так что про эффективность помолчал бы.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.06.2011, 17:36     Матрица, перегрузка операторов #14
а чё молчать то тут налицо неэфективное использование памяти
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.06.2011, 18:28     Матрица, перегрузка операторов #15
pito211, в наше время критична как раз не память, а быстродействие. Стандартный вектор во втором на высоте.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.06.2011, 18:53     Матрица, перегрузка операторов #16
silent_1991, признавайся, ты gta4 писал?

Так писать не дело. Может быть преподу показать в универе и прокатит, а так нет. Матрица - низкоуровневое представление и не нуждается чтобы её по векторам раскладывали или ещё как то, даже если это где-то существенно упрощает реализацию. На этапе проектирования осознанно идти на дублирование информации, которой может быть кстати не мало например для матрицы 1х10000, - сдаётся мне это хреновое проектирование

Добавлено через 2 минуты
матрица так сказать опорный инструмент, ей будет пользоваться более высокоуровневый код и поэтому она должна быть максимально шустрой и не расстрачивать память по пусту
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.06.2011, 19:07     Матрица, перегрузка операторов #17
pito211, смотря для каких целей мы это пишем. Если я, например, хочу написать какую-нибудь систему компьютерной алгебры (где мне важен результат, а не количество съеденной памяти), я напишу класс "вектор" (не динамический массив, а алгебраический вектор), с помощью этого класса и композиции напишу класс "матрица" и т.д. Мне хочется, чтобы систему можно было легко сопровождать и модифицировать. Разбиение глобальной задачи на такие вот подзадачи позволит мне этого добиться. Если же мне нужна экономия, то я представлю матрицу двумерным массивом, напишу простенькую обёртку и (для удобства работы) перегружу оператор (), который просто будет возвращать мне соответствующий элемент по двум индексам, а не извращаться с [][].
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.06.2011, 19:46     Матрица, перегрузка операторов #18
матрица, состоящая от векторов, каждый из которых содержит размер, может писаться только с одной целью - отмазаться от начальства. Модифицировать и сопровождать матрицу не надо. Никто же не модифицирует стлвские вектора и листы. Это ж базовый инструмент. Он должен работать по принципу "один раз написал и забыл", и если он так не работает, значит хреново он написан

и поговорка типа "в наше время память или быстродействие не критично" для всяких там ООП-шных штучек типа полиморфизма была придумана и не служит отмазкой для такого стиля кодинга. А то потом жалуются почему у меня гта4 не идёт, да потому что так пишут, какой то программист сыкономил три минуты на матрице, а маленькому мальчику в бедной африканской стране месяц придётся голодать чтобы купить новый камень!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.06.2011, 20:22     Матрица, перегрузка операторов #19
pito211, ок, спорить мне надоело. Тут и закончим. Пишите так, как удобно вам, я поступлю аналогично.

Не по теме:

И если уж на то пошло, то гта4 не из-за этого тормозит, а из-за консольности своей. Он ориентирован на многоядерность, даже двух ядер ему мало, вот и тормозит. Причины, как видите, могут быть разные, и в данном случае не память повлияла, а как раз производительность.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2011, 21:41     Матрица, перегрузка операторов
Еще ссылки по теме:

C++ Перегрузка операторов
C++ Перегрузка операторов(=,+)
C++ Перегрузка операторов С++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
24.06.2011, 21:41     Матрица, перегрузка операторов #20
может быть, хоть кто то напишет как перегрузить [][]. хотя бы прототипы. как перегрузить [] вроде понятно.
C++
1
int MyArray:: operator[] (int) const;
Yandex
Объявления
24.06.2011, 21:41     Матрица, перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 22:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru