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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Yakoot
15 / 15 / 2
Регистрация: 13.11.2011
Сообщений: 65
#1

перегрузка [] - C++

13.11.2011, 17:34. Просмотров 700. Ответов 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);
 
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2011, 17:34     перегрузка []
Посмотрите здесь:

Перегрузка - C++
ребята помогите сделать тут перегрузку очень нужно :) #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt;...

перегрузка <<, >>, [] - C++
правильно ли я перегрузил &gt;&gt;, &lt;&lt;, !?? у меня такое ощущение что неправильно, если всатвил стороку сout&lt;&lt;&quot;fvfsvdv&quot;&lt;&lt;endl; вместо ...

Перегрузка - C++
даны две перегрузки: 1. постфиксная для ++ чтобы прибавить 1 к height и к width Rectang &amp; operator ++(int) {height++; width++; ...

Перегрузка в c++ - C++
Собственно для чего нужна перегрузка функций или операторов ?

Перегрузка >> - C++
Доброго времени суток. Есть учебный пример перегрузки операций &gt;&gt; и &lt;&lt;. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace...

Перегрузка [][] - C++
Возможно ли для данного класса обеспечить перегрузку жвойных скобок с тем, чтобы в программе можно было использовать выражения типа: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
13.11.2011, 17:59     перегрузка [] #2
перегрузить [][] не выйдет у вас.
обычно так делают - для матрицы перегрузят [] как возврат строки, а для строки [] как возврат элемента. ну и с наследованием...
а 2 одинаковых [] сделать для 1 класса не выйдет...

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

Не по теме:

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

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

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

Добавлено через 1 час 44 минуты
ну так что?
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
13.11.2011, 22:25     перегрузка [] #6
ну как вариант передавать в кач-ве индекса "ту самую" формулу 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)]
Yakoot
15 / 15 / 2
Регистрация: 13.11.2011
Сообщений: 65
13.11.2011, 23:20  [ТС]     перегрузка [] #7
лан, подожду чо препод скажет) спасибо
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
14.11.2011, 00:45     перегрузка [] #8
Цитата Сообщение от Yakoot Посмотреть сообщение
есть класс матриц, матрица хранится в виде одномерного массива..
....
почитал где-то.. результат каждого [] должен выдавать строку из заданного массива.. тоесть первый выдаст строку из двухмерного, второй элемент из строки..
у тебя же одномерный массив, нет?..
Yakoot
15 / 15 / 2
Регистрация: 13.11.2011
Сообщений: 65
14.11.2011, 09:33  [ТС]     перегрузка [] #9
ну он двухмерный.. в объекте хранится как одномерный, рядом с числом строк и столбцов..
Yakoot
15 / 15 / 2
Регистрация: 13.11.2011
Сообщений: 65
20.11.2011, 15:43  [ТС]     перегрузка [] #10
а оказывается всё достаточно просто)
C++
1
2
3
4
5
6
7
double *matrix::operator [](int a)
{
    if (a < 0 || a > n)
        throw "Неверный номер строки";
    else
        return &p[a*m];
}
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
20.11.2011, 22:42     перегрузка [] #11
хитрО согласен.
сами дошли аль препод подсказал?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.11.2011, 14:56     перегрузка [] #12
OstapBender, стандартный приём, нарушающий инкапсуляцию. Ничего не мешает передать полученный указатель оператору delete.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
21.11.2011, 16:21     перегрузка [] #13
silent_1991, ну не знаю стандартный или не стандартный, но надеюсь он мне никогда не пригодится, т.к хранить 2-мерный массив в виде 1-мерного я не собираюсь )
Yakoot
15 / 15 / 2
Регистрация: 13.11.2011
Сообщений: 65
21.11.2011, 18:01  [ТС]     перегрузка [] #14
OstapBender, пока ждал препода нечто подобное в голове вертелось, а потом и он сказал тоже самое..

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

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

С другой стороны, существует масса способов как хакнуть класс, и обойти его инкапсуляцию. Так что, если кому нибудь очень понадобится, никакие private модификаторы его не остановят.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2011, 21:24     перегрузка []
Еще ссылки по теме:

Перегрузка - C++
Написать программу на языке C++, реализующию перегруженную функцию z_cnt, получа- ющую в качестве аргумента или массив целых чисел, или...

перегрузка [] - C++
Здравствуйте! код из учебного пособия. (возможно немного не рабочий) текст перед кодом- &quot;Пусть класс определен как строка символов....

Перегрузка + - C++
#include &lt;iostream&gt; using namespace std; class loc { int n , m; public: loc() {} loc( int lg , lt) { n = lg; m =...

Перегрузка - C++
Дали задачу, на перегрузку строк вот один из операторов который надо перегрузить. stringg&amp; operator+=( stringg a) { char...


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

Или воспользуйтесь поиском по форуму:
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
21.11.2011, 21:24     перегрузка [] #16
Bers, ага, например,
C++
1
#define private public
Yandex
Объявления
21.11.2011, 21:24     перегрузка []
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru