Я сейчас пишу 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[]
используется здесь?
(*this)[k]
использует неконстантный this
так как содержащая его функция не const
,
Отсюда неконстантная перегрузка []
предпочитается компилятором.
Вы можете обойти это, используя уродливый const_cast
, но на самом деле вы должны сохранить поведение двух версий []
Оператор максимально похож. Кроме std::vector
перегрузка []
не настаивает на проверке границ индекса, в отличие от at
который должен быть. Ваш код отклоняется от этого и поэтому может сбить с толку читателей вашего кода.
Других решений пока нет …