Перегрузка операторов C++. Умножение на константу

451
19 июня 2017, 21:17

Доброго времени суток!

Я создал структуру, которая имеет следующий вид:

struct variables {
    double x,y,z;
    double u,v,w;
    vector <double> J;
    vector <double> Omega;
    variables();
};

которую мне бы хотелось уметь умножать на число типа double, т.е. каждый элемент структуры умножить на это самое число (в том числе элементы массивов).

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

Собственно, вопрос заключается в том, как это нужно сделать? Нужно ли для этого отдельно реализовывать два оператора внутри структуры типа

friend const variables operator*(const variables& left, const double& right);
friend const variables operator*(const double& left, const variables& right);

или можно сделать это как-то иначе? Заранее спасибо!

Answer 1

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

К сожалению, реализовывать придется либо оба оператора: правый и левый, либо использовать библиотечные генераторы наподобие boost::operators (пример). Но от них может пострадать производительность для некоторых случаев. В предложениях к стандарту есть автоматическая генерация операторов, но я не знаю, какой статус оно сейчас имеет.

Answer 2

Достаточно просто внутри структуры перегрузить оператор

const variables operator*(variables& i) {
    x * i.x;
//    etc
    return this;
}
Answer 3

Да, если вы хотите иметь возможность умножать на скаляр типа double и справа, и слева, то для этого придется реализовать две версии перегруженного оператора operator *: один с параметром double слева, другой - один с параметром double справа. (В данном случае нет необходимости передавать параметры типа double по константный ссылке. Логичнее передавать просто по значению.)

Второй оператор (с параметром double справа) может быть перегружен как функцией-членом, так и отдельной функцией. Первый (с параметром double слева) может быть реализован только отдельной функцией. По этой причине, для единообразия, обе версии оператора обычно перегружают отдельной функцией, хотя такого единообразия формально не требуется.

Эти отдельные функции не обязаны быть friend-функциями. Но если вы в них хотите работать напрямую с закрытыми внутренностями класса (а обычно это нужно), то придется их объявить как friend-функции.

И, наконец, вас никто не заставляет реализовывать эти функции прямо внутри класса. Внутри класса должны располагаться только friend-объявления этих функций, а их реализацию (определения) вы можете расположить снаружи.

Однако у вас в в данный момент ваш класс объявлен как struct и все его внутренности полностью доступны внешнему миру. В такой ситуации вам вообще не нужны friend-функции и объявлять ваши операторы внутри класса как friend-функции никакой необходимости нет.

READ ALSO
Тестирующая система

Тестирующая система

Искал тестирующие системы на C++, чтобы задачи вставлять на сайт и решать ихИ наткнулся на Sharif Judge

191
Как установить Gamma Gallery (плагин галереи) на MODx?

Как установить Gamma Gallery (плагин галереи) на MODx?

Нужно к сайту подключить плагин галереи Gamma Gallery, чтобы админ сайта, не зная программирования и html мог добавлять/удалять фоткиЯ прошу вкратце...

301
Cannot read property &#39;top&#39; of null после обновления MODX Revo [требует правки]

Cannot read property 'top' of null после обновления MODX Revo [требует правки]

Обновил версию MODX да все бы и ничего, только фильтр товаров стал барахлить http://netakomcom/katalog-produkczii/kotelnoe-oborudovanie/ , может кто наставит на путь истинный,...

223
Jquery pseudo images [требует правки]

Jquery pseudo images [требует правки]

В одном изображении скрыты еще пятьМожет есть плагин jquery? Примером может служить: Яндекс недвижимость или Владис Наведите курсором на изображение...

205