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

Я создал полиномиальный класс, но хочу перегрузить оператор индексации, который будет использоваться в качестве установщика, например, myPolyObject[0] = 2.5, но при попытке его перегрузки выдает ошибку.

class Polynomial
{
public:
    Polynomial();
    Polynomial(Polynomial&);
    Polynomial(double* coefficient, int size);
    ~Polynomial() { delete [] polynomial ; }
    double operator [] (int exponent) const;
    friend ostream& operator << ( ostream& , const Polynomial&);
    Polynomial& operator = (const Polynomial&);
    double evaluate(double x) const;
    int getSize() const;
    double operator [] (int exponent, double coefficient);
    Polynomial& operator + ( Polynomial& );
    Polynomial& operator + ( double x );
    Polynomial& operator - (Polynomial&);
    Polynomial& operator - (double x);
    Polynomial& operator * (Polynomial&);
    Polynomial& operator * (double x);
private:
    double* polynomial;
};

В этом коде я хочу, чтобы двойной оператор [] (целая экспонента, двойной коэффициент) брал индекс (экспоненту) для массива и устанавливал значение этого индекса в значение двойного коэффициента.


person Vinay Lohana    schedule 24.06.2018    source источник
comment
double& operator[](int exponent). Вам нужно будет сделать так, чтобы оператор возвращал ссылку на значение double, в котором может быть сохранен коэффициент.   -  person Igor Tandetnik    schedule 25.06.2018
comment
Но как мне установить показатель степени и значение?   -  person Vinay Lohana    schedule 25.06.2018
comment
Если вы возвращаете ссылку, как сказал Игорь, вы просто получаете ее и устанавливаете для нее значение. Звучит запутанно, так что: перепишите это как double& operator[] (int exponent); и просто сделайте так, как polynomial[5] = 7.;, как вы, вероятно, и предполагали.   -  person Aziuth    schedule 25.06.2018


Ответы (1)


Ваш вопрос, кажется, требует двух разных вещей, на первый бит дается ответ в комментариях, верните ссылку. Вот пример для полноты,

struct example
{
    double value_[10];
    double& operator [] (int index) {
       return value_[index];
    }
};

int main() {
    example e;
    e[0] = 2.2;
    std::cout << e.value_[0] << std::endl;
}

Демо

Вы тогда говорите..

Я хочу, чтобы двойной оператор [] (целая экспонента, двойной коэффициент) брал индекс (экспоненту) для массива и устанавливал значение этого индекса в значение двойного коэффициента.

У вас не может быть operator[] с несколькими аргументами. Несколько вариантов; принять std::pair<int,double>, который имеет довольно чистый синтаксис. Например..

struct example
{
    double operator [] (const std::pair<int,double>& values) {
        return 2.0;
    }
};

int main() {
    example e;
    e[{1,2.2}];
    //or 
    e[std::make_pair(1,2.2)];
}

Демо

Или, если вам действительно нужна запятая, вы можете создать свой собственный тип для экспоненты и перегрузить оператор запятой.

struct exponent
{
    int exp_;
    double coeff_;
    exponent(int value) : exp_(value),coeff_(0){}

    operator std::pair<int,double>() {
        return std::make_pair(exp_,coeff_);
    }

    exponent& operator,(double coeff) {
        coeff_ = coeff;
        return *this;
    }
};

struct example
{
    double operator [] (const std::pair<int,double>& values) {
        return 2.0;
    }
};

int main() {
    example e;
    e[exponent(1), 3.3];
}

Демо

Лично я бы выбрал что-то вроде первого варианта или вместо этого перегрузил бы operator().

person rmawatson    schedule 24.06.2018
comment
У вас не может быть operator[] с несколькими аргументами. Разве вы не можете сделать это: operator[](arg1, arg2) Уродливо, как грех, и придирчиво. Тем не менее, очень хороший ответ. - person doug; 25.06.2018
comment
@doug Нет, вы не можете определить перегруженный operator[] с двумя аргументами. operator[] должна быть функцией-членом, принимающей ровно один аргумент. - person Igor Tandetnik; 25.06.2018
comment
Да, ты прав. Извините за тупой комментарий. Отличный ответ, кстати. - person doug; 25.06.2018