Доброго времени суток!
Я создал структуру, которая имеет следующий вид:
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);
или можно сделать это как-то иначе? Заранее спасибо!
Когда вы реализуете friend-функцию (оператор), вы на самом деле реализуете внешнюю функцию, просто она имеет доступ к приватным полям. Для простых структур в этом нет смысла, т.к. все поля публичны, можно реализовать просто внешнюю функцию (оператор).
К сожалению, реализовывать придется либо оба оператора: правый и левый, либо использовать библиотечные генераторы наподобие boost::operators (пример). Но от них может пострадать производительность для некоторых случаев. В предложениях к стандарту есть автоматическая генерация операторов, но я не знаю, какой статус оно сейчас имеет.
Достаточно просто внутри структуры перегрузить оператор
const variables operator*(variables& i) {
x * i.x;
// etc
return this;
}
Да, если вы хотите иметь возможность умножать на скаляр типа double
и справа, и слева, то для этого придется реализовать две версии перегруженного оператора operator *
: один с параметром double
слева, другой - один с параметром double
справа. (В данном случае нет необходимости передавать параметры типа double
по константный ссылке. Логичнее передавать просто по значению.)
Второй оператор (с параметром double
справа) может быть перегружен как функцией-членом, так и отдельной функцией. Первый (с параметром double
слева) может быть реализован только отдельной функцией. По этой причине, для единообразия, обе версии оператора обычно перегружают отдельной функцией, хотя такого единообразия формально не требуется.
Эти отдельные функции не обязаны быть friend-функциями. Но если вы в них хотите работать напрямую с закрытыми внутренностями класса (а обычно это нужно), то придется их объявить как friend-функции.
И, наконец, вас никто не заставляет реализовывать эти функции прямо внутри класса. Внутри класса должны располагаться только friend-объявления этих функций, а их реализацию (определения) вы можете расположить снаружи.
Однако у вас в в данный момент ваш класс объявлен как struct
и все его внутренности полностью доступны внешнему миру. В такой ситуации вам вообще не нужны friend-функции и объявлять ваши операторы внутри класса как friend-функции никакой необходимости нет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Искал тестирующие системы на C++, чтобы задачи вставлять на сайт и решать ихИ наткнулся на Sharif Judge
Нужно к сайту подключить плагин галереи Gamma Gallery, чтобы админ сайта, не зная программирования и html мог добавлять/удалять фоткиЯ прошу вкратце...
Обновил версию MODX да все бы и ничего, только фильтр товаров стал барахлить http://netakomcom/katalog-produkczii/kotelnoe-oborudovanie/ , может кто наставит на путь истинный,...
В одном изображении скрыты еще пятьМожет есть плагин jquery? Примером может служить: Яндекс недвижимость или Владис Наведите курсором на изображение...