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

правильная перегрузка операторов - C++

Восстановить пароль Регистрация
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
08.04.2013, 00:17     правильная перегрузка операторов #1
Доброго времени суток. Я пишу класс матриц для себя. Возникла проблема при перегрузке операторов. Что должен возвращать оператор + и как это совместить с оператором = ?
В моем коде запись c=a+b;(где c,a,b-переменные типа матрицы) работать не будет, потому что оператор + возвращает значение,а оператор = принимает ссылку.
Как избежать этой проблемы?
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class matrix
{
public:
    matrix(int,int);
    ~matrix(void);
    int columns;//кол столбиков
    int rows;//кол строк
    double **mat;//сама матрица
    //double det(void);
    //matrix inverse(void);//нахождение обратной
    matrix transpon(void);
    void transpon_this(void);
    matrix operator=(const matrix &);//оператор присваивания
    matrix operator+(const matrix &);//оператор сложения
    matrix operator-(const matrix &);//оператор вычитания
    matrix operator*(const matrix &);//оператор умножения матриц
    bool operator==(const matrix &);//оператор сравнения
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
matrix matrix::operator=(const matrix &input)
{
    for (int i=0; i<rows;++i)
        delete [] mat[i];
    delete [] mat;
 
    rows=input.rows;
    columns=input.columns;
    mat=new double*[rows]; 
    for (int i=0;i<rows;++i)
        mat[i]=new double[columns];
 
    for (int i=0;i<rows;++i)
        for(int j=0;j<columns;++j)
            mat[i][j]=input.mat[i][j];
    return *this;
}
C++
1
2
3
4
5
6
7
8
9
10
11
matrix matrix::operator+(const matrix & rightmatrix)
{
    if ((rows==rightmatrix.rows)&&(columns==rightmatrix.columns))
    {
        matrix temp(rows,columns);
        for (int i=0;i<rows;++i)
            for (int j=0;j<columns;++j)
                temp.mat[i][j]=mat[i][j]+rightmatrix.mat[i][j];
        return temp;
    } else return(matrix(0,0));
}
Спасибо, всем ответившим!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 00:17     правильная перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
[c++] Перегрузка операторов C++
Перегрузка операторов C++
Перегрузка операторов C++
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.04.2013, 01:25     правильная перегрузка операторов #2
Цитата Сообщение от metaluga145 Посмотреть сообщение
а оператор = принимает ссылку
ссылку на константу, в чем вообще проблема?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.04.2013, 01:58     правильная перегрузка операторов #3
В моем коде запись c=a+b;(где c,a,b-переменные типа матрицы) работать не будет, потому что оператор + возвращает значение,а оператор = принимает ссылку.
Как избежать этой проблемы?
Как это не будет работать? с=a+b можно записать в виде c.operator=(operator+(a+b)); это если б ты глобально operator+ перегрузил, а у тебя по коду запишется c.operator=(a.operator+(b)), что считай тоже самое. a.operator+(b) вернет копию нового объекта, который попадет по ссылке в функцию operator=(), то есть объекту с присвоится значение объекта третьего который вернет функция operator+(), и который просто передался по ссылке.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
08.04.2013, 18:47  [ТС]     правильная перегрузка операторов #4
Проблема в том,что в классе есть динамический массив, а в операторе сложения я создаю временный элемент класса,который возвращает оператор. Так вот что происходит раньше: выполняется оператор присваивания или вызывается деструктор временного элемента?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.04.2013, 19:11     правильная перегрузка операторов #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
Так вот что происходит раньше: выполняется оператор присваивания или вызывается деструктор временного элемента?
раньше выполнится конструктор копирования
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
08.04.2013, 19:30  [ТС]     правильная перегрузка операторов #6
Хм...Во время выполнения оператора присваивания вылетает ошибка "Access violation", происходит это в месте обращения к элементу массива переменной input (см. код выше). Если просто посмотреть что находится в массиве, то там вместо чего-то вразумительного находится "CXX0030: Error: expression cannot be evaluated". Что это может значить?
Yandex
Объявления
08.04.2013, 19:30     правильная перегрузка операторов
Ответ Создать тему
Опции темы

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