Перегрузка оператора вызова функции и типа возврата
Я проектирую небольшую математическую библиотеку. У меня есть классы, которые представляют классы функций, например, полиномиальные. Когда они создаются, предоставляются необходимые параметры (a1, a2, a3), так что объект фактически представляет определенный полином (a1*x^2 + a2*x + a3).
Затем я хочу предоставить функциональность оценки функции в определенной точке (х =3, у =?). Я прочитал эту вики и главу 12 "Мышление в C++", том. 1 Брюсом Эккелем. Оба они говорят, что я должен решить, перегружать или нет, основываясь на "значении" оператора. Я не опытный программист C++, но, насколько мне известно, если у меня есть класс, представляющий функцию, и я использую obj(x)
что я ожидаю, это ценность y
функция берет при этом x
,
Сомнения возникают в отношении измерений: я должен также представлять векторные функции ( http://en.wikipedia.org/wiki/Vector_function), например, a1*x1 + a2*x2, и у меня будет подпись, подобная этой: operator()(real x1, real x2)
, Моя проблема с типом возврата. Если y1 = a1*x1 + a2*x2 является вектором (как математически, так и в C++), я должен вернуть y1 по значению или по ссылке? И я должен предоставить также const
версия?
PS Это мой первый вопрос здесь, на Stackru.com, поэтому, пожалуйста, скажите мне, если что-то не так в этом вопросе (название, теги, сам вопрос:P), и я с удовольствием исправлю это.
2 ответа
'Должен ли я вернуть y1 по значению или по ссылке?' По значению, несомненно, нет хорошего способа вернуть ссылку на вновь созданный объект. Если стоимость копирования ваших объектов является проблемой, то вам следует обратиться к какой-либо технологии интеллектуального указателя, чтобы обеспечить быстрое копирование.
"И я должен предоставить также const версию? Из того, что вы сказали, вы должны предоставить только постоянную версию.
Вы возвращаете что-либо только по ссылке, если оно постоянно хранится где-то еще. Поскольку ваше возвращаемое значение является временным, оно должно быть возвращено по значению.
Поскольку вы ничего не меняете в функции, метод должен быть постоянным.