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

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

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

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

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

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

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

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

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

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

Class & operator's |Error: undefined reference to operator - C++
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&amp;, Fraction...

Вызов operator[] через operator[] const - C++
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

operator char() или operator int() - C++
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Реализация operator + через operator += - C++
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
19.12.2011, 09:10 #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];
 
 
}
1
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 11:27  [ТС] #3
как то замудренно немного...

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

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

Добавлено через 1 минуту
Цитата Сообщение от Fantom.AS Посмотреть сообщение
double **Matr;
Это указатель на массив указателей на массивы. Первый индекс индексирует массив даблов, второй - элемент матрицы.
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 11:49  [ТС] #5
с этим я уже разобрался.
меня сейчас интересует, можно ли подобным образом записать значение в ячейку?
0
Bers
Заблокирован
19.12.2011, 11:53 #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; //записали в матрицу
}
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 12:08  [ТС] #7
Bers, Я это уже изменил. дописал сам, все работает!
Меня сейчас интересует другое, можно ли подобным образом записать значение в ячейку?
0
Bers
Заблокирован
19.12.2011, 12:12 #8
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Bers, Я это уже изменил. дописал сам, все работает!
Меня сейчас интересует другое, можно ли подобным образом записать значение в ячейку?
Вот это для кого было написано:
Цитата Сообщение от Bers Посмотреть сообщение
matrix[y][x]=1; //записали в матрицу
Смотри внимательнее)
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
19.12.2011, 17:06  [ТС] #9
Цитата Сообщение от Bers Посмотреть сообщение
Вот это для кого было написано:
Сообщение от Bers
matrix[y][x]=1; //записали в матрицу
Смотри внимательнее)
Не работает. Я это сразу попробовал. Значение элемента матрицы не меняется...
0
Bers
Заблокирован
19.12.2011, 17:23 #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 минут
хотя.. вот щас проверил по человечески... у меня лично все прекрасно и старый вариант записывал
0
sandye51
программист С++
684 / 586 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
19.12.2011, 17:28 #11
Цитата Сообщение от Bers Посмотреть сообщение
А... я забыл просто про одну особенность))
не забыл, она тут вообще ни к чему

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

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

Подобного рода защита ведёт к падению производительности, и частично усложняет понимание архитектуры продукта.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.12.2011, 18:34 #15
Цитата Сообщение от Fantom.AS Посмотреть сообщение
вот мне и интересно, как можно добиться тех же результатов, но не допуская возможности нарушения данных класса
используй (int i, int j), и никого не мучай
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 18:34
Привет! Вот еще темы с ответами:

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

Operator +, operator += — какой через какой реализовывать? - C++
Для class Fraction { // ... public: Fraction operator + ( const Fraction&amp; right ) const; Fraction&amp; operator += ( const...

Чем "operator *=" отличается от "operator *"? - C++
снова застряла, не могу понять, чем этот оператор должен отличаться от оператора*.....? вот он, но это работает только в случае...

Expected init-declarator before "operator".expected `,' or `;' before "operator" - C++
Пример не мой. Пытаюсь у себя запустить и чтото неполучается. Ошибка на строке 24 Expected init-declarator before &quot;operator&quot;.Expected...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.12.2011, 18:34
Ответ Создать тему
Опции темы

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