Почему не используется оператор только для чтения?

Я сейчас пишу Polynomial-класс в C ++, который должен представлять полином следующего вида:

p(x) = a_0 + a_1*x^1 + a_2*x^2 + ... + a_i*x^i

где a_0, ..., a_i являются все int«S.

Класс внутренне использует переменную-член a_ типаstd::vector<int> хранить постоянные факторы a_0, ..., a_i, Чтобы получить доступ к постоянным факторам operator[] перегружается следующим образом:

Прочитайте и напишите:

int &operator[](int i)
{
return a_.at(i);
}

Это не удастся при попытке изменить один из факторов a_i с:

i > degree of polynomial = a_.size() - 1

Только для чтения:

int operator[](int i) const
{
if (i > this->degree()) {
return 0;
}

return a_.at(i);
}

Немного другая реализация позволяет довольно удобно зацикливаться на множителях двух полиномов разных размеров (не беспокоясь о степень полинома).

К сожалению, я, кажется, что-то здесь упускаю, так как operator+перегрузка (что делает использование этого удобным только для чтенияoperator[]) не удается

operator+-overloading:

Polynomial operator*(const Polynomial &other) {
Polynomial res(this->degree() + other.degree());

for (int i = 0; i <= res.degree(); ++i) {
for (int k = 0; k <= i; ++k) {
res[i] += (*this)[k] * other[i-k];
}
}

return res;
}

Не против математики. Важным моментом является то, что i всегда в диапазоне

0 <= i < res.a_.size()

таким образом, писать res[i] является действительным. тем не мение (*this)[k] а также other[i-k] попробуйте прочитать из индексов, которые не обязательно лежат в диапазоне [0, (*this).a_.size() - 1],

Это должно быть хорошо с нашими только для чтения-реализация operator[] право? Я все еще получаю сообщение об ошибке при попытке доступа a_ по недействительным показателям. Что может заставить компилятор использовать читай пиши-Реализация в линии:

res[i] += (*this)[k] * other[i-k];

Особенно часть на правой стороне равенства.

Я уверен, что ошибка вызвана «неправильным» использованием прочти и напишиoperator[], Потому что с дополнительной проверкой исправляет недействительный доступ:

if (k <= this->degree() && i-k <= other.degree()) {
res[i] += (*this)[k] * other[i-k];
}

Чего мне не хватает с использованием operator[]-overloading? Почему не только для чтенияoperator[] используется здесь?

0

Решение

(*this)[k] использует неконстантный this так как содержащая его функция не const,

Отсюда неконстантная перегрузка [] предпочитается компилятором.

Вы можете обойти это, используя уродливый const_cast, но на самом деле вы должны сохранить поведение двух версий [] Оператор максимально похож. Кроме std::vector перегрузка [] не настаивает на проверке границ индекса, в отличие от at который должен быть. Ваш код отклоняется от этого и поэтому может сбить с толку читателей вашего кода.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]