Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65

перегрузка []

13.11.2011, 17:34. Показов 1986. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток.. суть задачи такова:
есть класс матриц, матрица хранится в виде одномерного массива..
я перегрузил << и +=
теперь нужно получить доступ для чтения и записи к элементу с заданными индексами..
почитал где-то.. результат каждого [] должен выдавать строку из заданного массива.. тоесть первый выдаст строку из двухмерного, второй элемент из строки..
впринципе можно это сделать.. только вот как?
циклом выдергивать из моего одномерного массива элементы с нужным индексом, их сохранять в другой одномерный массив.. получается нужно создавать каждый раз объект, в котором в итоге будет матрица из одного элемента?

Добавлено через 50 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class matrix
{
private:
    int n, m;
    double *p;
 
public:
        matrix();   
        matrix(int, double []);
    matrix(int, int, double []);
        matrix(const matrix &a);
    friend std::ostream &operator<<(std::ostream &, const matrix &);
        friend matrix &operator+=(matrix &, matrix &);
        friend matrix &operator[](matrix &, int);
 
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2011, 17:34
Ответы с готовыми решениями:

Перегрузка в виде метода VS Перегрузка в виде функции друг
Привет! Собственно сабж: В каких случаях используется перегрузка в виде метода, а когда в виде функции друг? Добавлено через 4...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

перегрузка []
Есть класс, и почему компилятор выдает ошибку на функции int &amp;operator(int); #ifndef ARRAY1_H #define ARRAY1_H #include...

15
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
13.11.2011, 17:59
перегрузить [][] не выйдет у вас.
обычно так делают - для матрицы перегрузят [] как возврат строки, а для строки [] как возврат элемента. ну и с наследованием...
а 2 одинаковых [] сделать для 1 класса не выйдет...

лучше перегрузи operator() (int,int)
0
13.11.2011, 18:02

Не по теме:

Цитата Сообщение от OstapBender Посмотреть сообщение
ну и с наследованием...
а наследовать-то что и зачем?:)

0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
13.11.2011, 18:04
Jupiter, ну класс допустим Матрица наследует класс Вектор
ну можно его как вложенный конечно сделать...
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
13.11.2011, 21:53  [ТС]
ну с () было б проще канеш.. но по заданию сказано
II. С помощью операторов-элементов класса обеспечить:
1) доступ к элементам матрицы по индексу строки и столбца (чтение/запись), т.е. переопределить оператор [];

Добавлено через 1 час 21 минуту
и в том же задании сказано хранить двухмерный массив в виде одномерного

Добавлено через 1 час 44 минуты
ну так что?
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
13.11.2011, 22:25
ну как вариант передавать в кач-ве индекса "ту самую" формулу i*(кол. столбцов)+j
подходи к преподу и обсуждай с ним, иначе никак.

Добавлено через 2 минуты
да вариантов можно придумать... но они все "сам понимаешь".
C++
1
2
3
4
struct Index {
int i;
int j;
};
C++
1
2
3
double& Matrix::operator[] (Index ind) {
return p[ind.i*m+ind.j];
}
вызов:
C++
1
2
Matrix data(...);
std::cout << data[Index(i,j)]
1
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
13.11.2011, 23:20  [ТС]
лан, подожду чо препод скажет) спасибо
0
 Аватар для besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
14.11.2011, 00:45
Цитата Сообщение от Yakoot Посмотреть сообщение
есть класс матриц, матрица хранится в виде одномерного массива..
....
почитал где-то.. результат каждого [] должен выдавать строку из заданного массива.. тоесть первый выдаст строку из двухмерного, второй элемент из строки..
у тебя же одномерный массив, нет?..
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
14.11.2011, 09:33  [ТС]
ну он двухмерный.. в объекте хранится как одномерный, рядом с числом строк и столбцов..
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
20.11.2011, 15:43  [ТС]
а оказывается всё достаточно просто)
C++
1
2
3
4
5
6
7
double *matrix::operator [](int a)
{
    if (a < 0 || a > n)
        throw "Неверный номер строки";
    else
        return &p[a*m];
}
2
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
20.11.2011, 22:42
хитрО согласен.
сами дошли аль препод подсказал?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
21.11.2011, 14:56
OstapBender, стандартный приём, нарушающий инкапсуляцию. Ничего не мешает передать полученный указатель оператору delete.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
21.11.2011, 16:21
silent_1991, ну не знаю стандартный или не стандартный, но надеюсь он мне никогда не пригодится, т.к хранить 2-мерный массив в виде 1-мерного я не собираюсь )
0
15 / 15 / 5
Регистрация: 13.11.2011
Сообщений: 65
21.11.2011, 18:01  [ТС]
OstapBender, пока ждал препода нечто подобное в голове вертелось, а потом и он сказал тоже самое..

silent_1991, опасненько тоесть выходит такое делать?
0
Заблокирован
21.11.2011, 19:02
Цитата Сообщение от Yakoot Посмотреть сообщение
опасненько тоесть выходит такое делать?
Ну так то, вряд ли кто нибудь будит целенаправленно вредить, и убивать данные по указателю.

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

С другой стороны, существует масса способов как хакнуть класс, и обойти его инкапсуляцию. Так что, если кому нибудь очень понадобится, никакие private модификаторы его не остановят.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
21.11.2011, 21:24
Bers, ага, например,
C++
1
#define private public
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2011, 21:24
Помогаю со студенческими работами здесь

C++ Перегрузка
Добрый вечер,очень прошу мне помочь,уже 2 часа читаю методичку и всё без результатов,нужно перегрузить функцию min_el поиска минимального...

Перегрузка
Класс - множество set. Дополнительно перегрузить следующие операции: -- удалить элемент из множества (типа set-item); * - пересечение...

перегрузка
1 С помощью механизма перегрузки функций реализовать функции для нахождения суммы: 1) двух чисел (результат – число); 2) двух строк...

Перегрузка +,-,++,--
Задание примерно такое: Создать класс линейного списка List. С помощью перегруженных операций реализовать: 1) переместиться в...

Перегрузка +
код: #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; template &lt;class T &gt; class theMatrix { ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru