Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Значение, возвращаемое перегруженными арифм. операциями

8.2K
04 декабря 2006 года
SDRAM DIMM
8 / / 30.11.2004
Имеется некоторый класс "матрица" CMatrix, в котором перегружена операция сложения. Хочется, чтобы эта операция возвращала значение типа CMatrix. В классе имеется деструктор, который уничтожает объект при попытке просто вернуть значение локальной переменной.

Как оформить такую функцию?
5.4K
05 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: SDRAM DIMM
Имеется некоторый класс "матрица" CMatrix, в котором перегружена операция сложения. Хочется, чтобы эта операция возвращала значение типа CMatrix.


внутри класса:

 
Код:
inline CMatrix operator +(const CMatrix &other) {
        CMatrix result();
// помещаешь сумму матриц в матрицу result.
        return result;
    }


Тут создается временный объект result. Но по выходу из программы происходит копирование матрицы. Если матрица не допускает поверхностного копирования, надо сделать конструктор копирования и перегрузить оператор == и, деструктор который будет освобождать выделенную оператором new память (если надо).

Цитата: SDRAM DIMM
В классе имеется деструктор, который уничтожает объект при попытке просто вернуть значение локальной переменной.

Как оформить такую функцию?



А эту часть я вообще не понял. :-(

309
05 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
inline здесь лишнее - так как при завершении функции объект "результат" будет удалён путём вызова деструктора, "встроенной" функция по-любому не получится. А вот такой код будет встроенным.
 
Код:
inline CMatrix& operator += (const CMatrix &Other)
{
// Код суммирования матриц
   return *this; // Возвращение "себя" как результата
}

При условии, что нет циклов и прочих действий, недопустимых в inline
5.4K
05 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: el scorpio
inline здесь лишнее - так как при завершении функции объект "результат" будет удалён путём вызова деструктора, "встроенной" функция по-любому не получится.

Что мешает объявить деструктор inline?

3
05 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: el scorpio
inline здесь лишнее - так как при завершении функции объект "результат" будет удалён путём вызова деструктора, "встроенной" функция по-любому не получится.


А какое отношение имеет inline к возвращаемому значению?

Цитата: el scorpio

При условии, что нет циклов и прочих действий, недопустимых в inline


Циклы тоже не имеют отношения к inline.
inline - рекомендация компилятору, он ей не обязан следовать и все зависит от реализации компилятора, поэтому возможны компиляторы, которые циклы как инлайнят так и нет.
Кстати, если метод определяется внутри определения класса (что собственно и делается в приведенных примерах кода), то inline писать не обязательно, метод будет считаться инлайновым автоматически.

А вот так писать нельзя:

Цитата: Svyatozar

 
Код:
inline CMatrix operator +(const CMatrix &other) {
        [color=red]CMatrix result();[/color]
// помещаешь сумму матриц в матрицу result.
        return result;
    }

5.4K
05 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: Green
А вот так писать нельзя:

Пустые конечно нельзя, но параметры зависят от конструкторов. Для тебя лично буду ставить многоточия вместо параметров.

3
05 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: Svyatozar
Пустые конечно нельзя, но параметры зависят от конструкторов. Для тебя лично буду ставить многоточия вместо параметров.


Спасибо :)
Только не троеточие, я его не люблю (проблема "void*"). :)

Обоснование простое. Найдите хоть одно отличие:
CMatrix result();
и
CMatrix func();

5.4K
05 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: Green
Спасибо :)
Только не троеточие, я его не люблю (проблема "void*"). :)

Обоснование простое. Найдите хоть одно отличие:
CMatrix result();
и
CMatrix func();


Согласен, выглядит неоднозначно. Я хотел задействовать конструктор копии, потом подумал а что если класс CMatrix виртуальный. Вариантов может быть несколько.

3
05 декабря 2006 года
Green
4.8K / / 20.01.2000
Это не только выглядит неоднозначно, но вводит в заблуждение компилятор, поэтому им воспринимается однозначно, как ошибка.
5.4K
06 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: Green
Это не только выглядит неоднозначно, но вводит в заблуждение компилятор, поэтому им воспринимается однозначно, как ошибка.

Дык полуфабрикат не предназначен для прямой компиляции. То что внутри функции сильно зависит от реализации класса. Я просто хочу показать что инициализировать создаваемый объект можно при помощи недефолтового конструктора, а там уже человек сам думает. Можно даже сделать конструктор который принимает указатели на две матрицы и сохраняет сумму в создаваемой матрице. Тогда все делается в конструкторе с двумя параметрами...

309
06 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Svyatozar
Перебор со сложностью: operator + должен делать только сложение двух матриц указанного типа.
Чтоже касается "производных" типов, то здесь можно сделать простым использованием операторов типа "+=". Кстати, если есть operator +, то operator += напрашивается сам собой

Код:
class TMatrixA
{
TMatrixA& operator += (const TMatrixA &Other)
{
// код прибавления другой матрицы к этой
   return *this;
};

TMatrixA operator + (const TMatrixA &Other) const
{
   TMatrixA Copya = *this;
   return (Copya += Other); // И весь код :D
}
};

// Производный объект "Матрица"
class TMatrixB: public TMatrixA
{
TMatrixB& operator += (const TMatrixB &Other)
{
   TMatrixA::operator += (Other); // Вызываем суммирование базового класса
// код прибавления другой матрицы к этой
   return *this;
};

TMatrixB operator + (const TMatrixB &Other) const
{
   TMatrixB Copya = *this;
   return (Copya += Other); // И весь код :D
}

};


За счёт этого мы избегаем наследования "+", который многократно возвращает временные объекты, заменяя вызовами оператора "+=", который возвращает ссылку.
Явный выигрыш в производительности программы.
5.4K
06 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: el scorpio
За счёт этого мы избегаем наследования "+", который многократно возвращает временные объекты, заменяя вызовами оператора "+=", который возвращает ссылку.
Явный выигрыш в производительности программы.


Ну у тебя временный объект тоже создается
TMatrixB Copya = *this;
используется (перегруженный?) оператор = который по-видимому производит копирование, запускается функция делающая сложение и при выходе из функции результат заносится в стек...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог