Я пишу шаблон Polynom<T>
class, где T
- числовой тип его коэффициентов.
Коэффициенты полинома хранятся в std::vector<T> coefficients
, где coefficients[i]
соответствует x^i
в реальном полином.(таким образом, степени х в порядке возрастания).
Гарантируется, что вектор coefficients
всегда содержит хотя бы один элемент.- для нулевого полинома это T()
.
Я хочу перегрузить operator[]
, чтобы сделать следующее:
- Индекс, переданный оператору [], соответствуетСтепень X, коэффициент которой мы хотим изменить / прочитать.
- Если пользователь хочет просто прочитать коэффициент, он должен выбросить отрицательные индексы, вернуть
coefficients.at(i)
для индексов в сохраненнойдиапазон - и разумно возвращает 0 для всех других индексов, не выбрасывает. - Если пользователь хочет изменить коэффициент, он должен выбросить отрицательные индексы, но позволитьПользователь может свободно изменять все остальные индексы, даже если указанный индекс больше или равен
coefficients.size()
.Поэтому мы хотим как-то изменить размер вектора.
Основная проблема, с которой я столкнулся, заключается в следующем:
1.
Как мне различить прочитанноедело и запись дела?Один человек оставил меня без объяснения, но сказал, что написание двух версий:
const T& operator[] (int index) const;
T& operator[] (int index);
было недостаточно.Однако я подумал, что компилятор предпочтет const-версию в случае чтения, не так ли?
2.
Я хочу убедиться, что в векторе coefficients
никогда не сохраняются конечные нули.Поэтому мне как-то нужно заранее знать, «перед», что я возвращаю изменяемый T&
моего коэффициента, какое значение пользователь хочет присвоить.И я знаю, что operator[]
не получает второй аргумент.
Очевидно, что если это значение не равно нулю (не T ()), то я должен изменить размер моего вектора и установить соответствующий коэффициент дляпереданное значение.
Но я не могу сделать это заранее (до возврата T&
из operator[]
), потому что если назначаемое значение равно T (), то при условии, что я изменю свой вектор коэффициентов взаранее, в конце концов, у него будет много конечных «нулей».
Конечно, я могу проверить наличие конечных нулей в любой другой функции класса и удалить их в этом случае.Мне кажется очень странным решение, и я хочу, чтобы каждая функция начинала работать в предположении, что в конце вектора нет нулей, если его размер> 1.
Не могли бы вы посоветовать мне какКакое конкретное решение этой проблемы?Я что-то слышал о написании внутреннего класса, неявно преобразуемого в T&
с перегруженным operator=
, но мне не хватает деталей.
Большое спасибо заранее!