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

Оператор индексирования [] С++ - C++

Восстановить пароль Регистрация
 
Vladislav_
4 / 4 / 0
Регистрация: 25.06.2013
Сообщений: 9
26.10.2013, 03:41     Оператор индексирования [] С++ #1
Я перегрузил оператор индексирования таким образом:
C++
1
 float* operator[] (unsigned int i){return arr[i];}
я не уверен в том что я корректно его перегрузил...
И у меня есть перегруженный оператор суммирования, определенный вне класса:
C++
1
2
3
4
5
6
7
8
FMATRIX& operator+ (FMATRIX &a, FMATRIX &b){
    if (a.GetCol() != b.GetCol() || a.GetRow() != b.GetRow()) return a;
    FMATRIX *temp = new FMATRIX(a.GetCol(), a.GetRow());
    for (unsigned int i = 0; i < a.GetCol(); i++)
        for (unsigned int j = 0; j < a.GetRow(); j++)
            *temp[i][j] = a[i][j] + b[i][j];
    return *temp;
}
Проблема в том что когда я пишу так: temp->operator[](i)[j] = a[i][j] + b[i][j]; то у меня все работает норм! Но когда я хочу записать таким образом его: *temp[i][j] = a[i][j] + b[i][j]; то прога хоть и компилируется но потом на каком то этапе исполнения выбивает ошибку:
- this 0x0080789c {arr=0xfdfdfdfd _col=2880154539 _row=2880154539 } FMATRIX * const
- arr 0xfdfdfdfd float * *
CXX0030: ошибка: невозможно вычислить выражение

КАК ИСПРАВИТЬ, ЧТО БЫ МОЖНО БЫЛО записывать как в моем примере перегрузки оператора+ который выше.
или что вообще нужно изменить что бы этот оператор конкретно работал??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.10.2013, 04:20     Оператор индексирования [] С++ #2
Vladislav_, а зачем вообще создавать матрицу динамически? почему бы не так
C++
1
FMATRIX temp(a.GetCol(), a.GetRow());
И возвращать из сложения не ссылку на матрицу, а объект
Vladislav_
4 / 4 / 0
Регистрация: 25.06.2013
Сообщений: 9
26.10.2013, 17:15  [ТС]     Оператор индексирования [] С++ #3
Я не могу понять, если я возвращаю как значение то у меня выбивает эту же ошибку при выводе cout << a+a;
C++
1
2
3
4
5
6
7
8
9
ostream& operator<< (ostream& out, FMATRIX& obj){
    for (unsigned int i = 0; i < obj.GetCol(); i++)
    {
        for (unsigned int j = 0; j < obj.GetRow(); j++)
            out << obj[i][j] << "\t";
        out << "\n";
    }
    return out;
}
А когда пишу возврат через ссылку и присваиваю элементу значение таким образом: temp->operator[](i)[j] = a[i][j] + b[i][j]; - то все работает без ошибок....
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.10.2013, 23:01     Оператор индексирования [] С++ #4
Vladislav_, возвращать через ссылку вообще не вариант - оператор сложения должен возвращать новый объект. Именно объект, а не ссылку на непонятно как созданное и непонятно когда и как удаляемое нечто.
Конструктор копирования есть? И вообще хотелось бы глянуть на код класса FMATRIX. По возможности, чтобы там были только необходимые методы, а не сотни строк кода)
Vladislav_
4 / 4 / 0
Регистрация: 25.06.2013
Сообщений: 9
26.10.2013, 23:19  [ТС]     Оператор индексирования [] С++ #5
Просто єто задание на лабу с ООП и мне надо перегрузить все что только можно но там еще и половины не реализовано(
а конструктор копии я не переопределял.
Вложения
Тип файла: rar LR5_zz1.rar (1.7 Кб, 4 просмотров)
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.10.2013, 23:52     Оператор индексирования [] С++ #6
Vladislav_, добавьте конструктор копии, о котором я говорил выше, и все заработает.
Примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FMATRIX::FMATRIX(const FMATRIX& i_matrix)
{
    _col = i_matrix._col;
    _row = i_matrix._row;
 
    arr = new float *[_col];
 
    for (unsigned int i = 0; i < _col; ++i)
    {
        arr[i] = new float[_row];
        for (unsigned int j = 0; j < _row; ++j) {
            arr[i][j] = i_matrix.arr[i][j];
        }
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 00:31     Оператор индексирования [] С++
Еще ссылки по теме:

C++ Перегрузка оператора индексирования
Аналог перегрузки оператора индексирования (operator []) C++
C++ Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости

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

Или воспользуйтесь поиском по форуму:
Vladislav_
4 / 4 / 0
Регистрация: 25.06.2013
Сообщений: 9
27.10.2013, 00:31  [ТС]     Оператор индексирования [] С++ #7
Спасибо огромное))
Yandex
Объявления
27.10.2013, 00:31     Оператор индексирования [] С++
Ответ Создать тему
Опции темы

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