как создать перегрузку нескольких операторов в объектно-ориентированном программировании на С++, например obj[10]=3 с оператором [] и оператором =

у меня есть определенный класс, и я хочу создать 2 оператора, которые будут работать вместе

как класс с массивом, и я хочу изменить определенный индекс в массиве

нравится этот объект [3] = 5

Это возможно? если да, то как?

это код, который я сделал для оператора []


double Polynomial::operator[](int index) const {
    int maxT = this->currentMax;
    if (index > 0 && index < this->getDegree(false))
        return this->coefficients[index];
    cout << "overflow in index";
    system("pause");
}


person Tal K    schedule 22.04.2020    source источник
comment
Отвечает ли это на ваш вопрос? оператор перегрузки присваивания с оператором нижнего индекса   -  person scohe001    schedule 22.04.2020
comment
Хотя неправильно выполнять проверку границ в operator[] это нетрадиционно. Большинство контейнеров пропускают проверку границ в operator[] (чтобы быть как можно быстрее) и предоставляют функцию-член с именем at(), которая выполняет проверку границ и выдает исключение, если index выходит за границы. Кстати, index обычно должен быть типа unsigned, например size_t. Вот простой пример: godbolt.org/z/qr26cd   -  person Ted Lyngmo    schedule 22.04.2020
comment
Не существует одного оператора []=, поэтому вы не можете его перегрузить. Вы можете перегрузить оператор [] и оператор =.   -  person Thomas Matthews    schedule 22.04.2020
comment
@ThomasMatthews Я не вижу, чтобы оператор []= упоминался или подразумевался. В заголовке [] и = упоминаются отдельно.   -  person Ted Lyngmo    schedule 22.04.2020
comment
@TedLyngmo Когда я прочитал заголовок, в нем не упоминалось об использовании [] и = по отдельности.   -  person Thomas Matthews    schedule 22.04.2020
comment
@ThomasMatthews Может быть, я надел свои прощающие очки :-) Оператор [] и = оператор звучит как operator[] и operator= для меня, и реализация operator[] (не operator[]=) также делает я думаю, что ОП знает, что это отдельные операторы.   -  person Ted Lyngmo    schedule 22.04.2020


Ответы (1)


Ваш operator[] является методом const, поэтому его нельзя использовать для изменения членов. Если вы не хотите делать что-то необычное при назначении элементу, вам действительно не нужны некоторые operator=, когда ваш operator[] возвращает ссылку на элемент.

Как упоминалось в комментариях, проверка границ в operator[] нетипична. Учтите, что в цикле каждый вызов operator[] будет выполнять проверку границ, даже если пользователь удостоверился, что используются только действительные индексы. Это не совсем эффективно. Таким образом, в дополнение к вашему оператору const вы можете указать этот

double& Polynomial::operator[](size_t index)  {  // <-- no const
    return coefficients[index];
}

Предполагая, что у вас также есть метод size, вы можете написать цикл:

for (size_t i=0; i< poly.size(); ++i) {
    poly[i] = i;
}

PS: system("pause") нельзя, см. system(pause); - Почему это неправильно?

person 463035818_is_not_a_number    schedule 22.04.2020