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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
#1

Переопределение operator [][] - C++

19.12.2011, 06:54. Просмотров 1266. Ответов 20
Метки нет (Все метки)

Пишу свой класс матрица. Необходимо получать доступ к элементу матрицы.

Пробую переопределить оператор [][] обычным образом, но не получается.
Есть ли еще возможность получить доступ к элементу матрицы через [][]?

написал функцию double Element(int i,int j) {return Matr[i][j];}, но она меня не устраивает....
как быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2011, 06:54     Переопределение operator [][]
Посмотрите здесь:

переопределение operator[] - C++
я унаследовался вот так: template <class TKey, class TData> class fixedSizeCache: public std::map<TKey, stCache<TData>> { ...

Глобальное переопределение "operator <<" для char * - C++
Здравствуйте. Привожу пример для демонстрации проблемы. Помогите пожалуйста в ее устранении или нивелировании. std::ostream&amp;...

Operator= - C++
Добрый день. Имеется необходимость создать объект от родительского класса, а затем его наследнику присвоить объект другого типа. ...

operator >> - C++
// 1.h #ifndef STONEWT_H_ #define STONEWT_H_ using std::cout; using std::cin; using std::endl; class Stonewt { private: ...

operator() - C++
Здраваствуйте. Объясните пожалуйста смысл &quot;opereator()&quot; во всех случаях, что он делает, почему иногда впереди него ставится &quot;&amp;&quot;...

operator[] - C++
class A { public: A(){} prvate: int _m; }; Как перегрузить оператор , что бы можно было написать

operator= - C++
Такой вопрос. Есть объект. Хочу чтобы при присваивании его к чеслу выдавалось число. Например. class MyClass { short...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
19.12.2011, 09:10     Переопределение operator [][] #2
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
struct Test
{
 
    Test(): myMatrix(10, std::vector<int>(10,5) ) {} //заполним пятёрками 
    
   //вернёт строку таблицы
    std::vector<int>& operator[](uint y) { return myMatrix[y]; } 
    
    std::vector< std::vector<int>  > myMatrix;
};
 
 
int main()
{
    Test matrix;
 
    uint x=3,y=2;
    int a= matrix[y][x]; //здесь сначала возвращается строка
                         //и тут же у строки берётся элемент
 
   //можно даже записать так:
  a= (matrix[y]) [x];
 
   //или даже так:
 
  std::vector<int>& line = matrix[y];
  a= line[x];
 
 
}
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 11:27  [ТС]     Переопределение operator [][] #3
как то замудренно немного...

а если я в классе матрицу определяю так:
C++
1
double **Matr;
Как тогда переопределить?

Добавлено через 13 минут
ок, я это исправил. работает. тогда еще вопрос, можно ли в полученную ячейку записать значение? как это сделать?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.12.2011, 11:40     Переопределение operator [][] #4
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Пробую переопределить оператор [][]
А такой разве есть?

Добавлено через 1 минуту
Цитата Сообщение от Fantom.AS Посмотреть сообщение
double **Matr;
Это указатель на массив указателей на массивы. Первый индекс индексирует массив даблов, второй - элемент матрицы.
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 11:49  [ТС]     Переопределение operator [][] #5
с этим я уже разобрался.
меня сейчас интересует, можно ли подобным образом записать значение в ячейку?
Bers
Заблокирован
19.12.2011, 11:53     Переопределение operator [][] #6
Цитата Сообщение от Fantom.AS Посмотреть сообщение
как то замудренно немного...
а если я в классе матрицу определяю так:
Какие мы привередливые...
Как принцесса!
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
46
47
typedef unsigned int uint;
struct Test
{
    uint x,y; //размеры матрицы
    int** myMatrix; //это сама матрица
    
    Test()  //инициализация дин. матрицы
    {
        x=10; y=10; //стартовые размеры матрицы
        myMatrix = new int*[y]; //создали строки матрицы
        
        for( uint iy= 0; iy< y; ++iy)
        {
            myMatrix[iy]= new int[x]; //создали элементы строки матрицы
            
            for (uint ix=0; ix<x; ++ix) 
            {
                myMatrix[iy][ix]=5; //заполнили матрицу пятёрками
            }
        }
    }
    
    ~Test()
    {
        for( uint iy= 0; iy< y; ++iy)
        {
             delete[] myMatrix[iy]; //удалим элементы строки
        }
        delete [] myMatrix; //удалим саму матрицу
    }
 
    //вернёт строку из матрицы
    int* operator[] (uint val) { return myMatrix[val]; } 
};
 
 
int main()
{
    Test matrix;
 
    uint x=3, y=4;
    
    int* line = matrix[y]; //вернёт строку из матрицы
    int val = matrix[y][x]; //вернёт элемент
 
    matrix[y][x]=1; //записали в матрицу
}
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 12:08  [ТС]     Переопределение operator [][] #7
Bers, Я это уже изменил. дописал сам, все работает!
Меня сейчас интересует другое, можно ли подобным образом записать значение в ячейку?
Bers
Заблокирован
19.12.2011, 12:12     Переопределение operator [][] #8
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Bers, Я это уже изменил. дописал сам, все работает!
Меня сейчас интересует другое, можно ли подобным образом записать значение в ячейку?
Вот это для кого было написано:
Цитата Сообщение от Bers Посмотреть сообщение
matrix[y][x]=1; //записали в матрицу
Смотри внимательнее)
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 17:06  [ТС]     Переопределение operator [][] #9
Цитата Сообщение от Bers Посмотреть сообщение
Вот это для кого было написано:
Сообщение от Bers
matrix[y][x]=1; //записали в матрицу
Смотри внимательнее)
Не работает. Я это сразу попробовал. Значение элемента матрицы не меняется...
Bers
Заблокирован
19.12.2011, 17:23     Переопределение operator [][] #10
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Не работает. Я это сразу попробовал. Значение элемента матрицы не меняется...
А... я забыл просто про одну особенность))
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
46
typedef unsigned int uint;
struct Test
{
    uint x,y; //размеры матрицы
    int** myMatrix; //это сама матрица
 
    Test()  //инициализация дин. матрицы
    {
        x=10; y=10; //стартовые размеры матрицы
        myMatrix = new int*[y]; //создали строки матрицы
 
        for( uint iy= 0; iy< y; ++iy)
        {
            myMatrix[iy]= new int[x]; //создали элементы строки матрицы
 
            for (uint ix=0; ix<x; ++ix) 
            {
                myMatrix[iy][ix]=5; //заполнили матрицу пятёрками
            }
        }
    }
 
    ~Test()
    {
        for( uint iy= 0; iy< y; ++iy)
        {
            delete[] myMatrix[iy]; //удалим элементы строки
        }
        delete [] myMatrix; //удалим саму матрицу
    }
 
    //вернёт строку из матрицы
    int*& operator[] (uint val) { return myMatrix[val]; } 
};
 
 
int main()
{
    Test matrix;
 
    uint x=3, y=4;
    matrix[y][x]=1; //записали в матрицу
 
    int* line = matrix[y]; //вернёт строку из матрицы
    int val = matrix[y][x]; //вернёт элемент
}
Гм?)

Добавлено через 7 минут
хотя.. вот щас проверил по человечески... у меня лично все прекрасно и старый вариант записывал
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
19.12.2011, 17:28     Переопределение operator [][] #11
Цитата Сообщение от Bers Посмотреть сообщение
А... я забыл просто про одну особенность))
не забыл, она тут вообще ни к чему

в этом случае я могу присвоить какой-либо строке левый адрес и при вызове деструктора у тебя все упадет
Bers
Заблокирован
19.12.2011, 17:33     Переопределение operator [][] #12
Цитата Сообщение от sandye51 Посмотреть сообщение
потому что в этом случае я могу присвоить какой-либо строке левый адрес и при вызове деструктора у тебя все упадет
Конечно упадёт.
В любом случае, если ты возвращаешь указатель на внутренние данные своего класса, ты уже нарушаешь инвариант класса. И при желании, его можно будит легко сломать.
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 17:35  [ТС]     Переопределение operator [][] #13
вот мне и интересно, как можно добиться тех же результатов, но не допуская возможности нарушения данных класса
Bers
Заблокирован
19.12.2011, 17:43     Переопределение operator [][] #14
Цитата Сообщение от Fantom.AS Посмотреть сообщение
вот мне и интересно, как можно добиться тех же результатов, но не допуская возможности нарушения данных класса
Данные класса итак не будут нарушены, если не пытаться вредить специально.

Если очень нужно сделать дополнительную защиту от дурака - возвращать нужно не голые указатели на элементы матрицы, а некие умные указатели, которые не позволят ничего плохого сотворить с самим элементом матрицы, но позволяет работать с ним, как ни в чем не бывало.

Подобного рода защита ведёт к падению производительности, и частично усложняет понимание архитектуры продукта.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 18:34     Переопределение operator [][]
Еще ссылки по теме:

Operator* - C++
в этой программе мне надо умножить два числа a &amp; b ??? допустим в ob(2,5) перемножить 2 &amp; 5 #include&lt;iostream&gt; #include&lt;vector&gt; ...

Operator*=(); - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace::std; class Distance //Класс английских длин { ...

Operator + - C++
Создайте в классе Circle оператор + для сложения объектов типа Circle. Необходимо складывать только величины радиусов itsRadius. ...

operator< - C++
bool operator&lt;(char c1,char c2) { //error C2803: 'operator &lt;' must have at least one formal parameter of class type if...

operator - C++
Всем привет, опять непонятка в книге, дошел до оператора operator и ничего не понял, для чего он нужен, что он делает, то есть как он...


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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.12.2011, 18:34     Переопределение operator [][] #15
Цитата Сообщение от Fantom.AS Посмотреть сообщение
вот мне и интересно, как можно добиться тех же результатов, но не допуская возможности нарушения данных класса
используй (int i, int j), и никого не мучай
Yandex
Объявления
19.12.2011, 18:34     Переопределение operator [][]
Ответ Создать тему
Опции темы

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