重载运算符[]用作多项式类的设置器

时间:2018-06-24 21:26:15

标签: c++ polynomials

我已经创建了一个Polynomial类,但是我想重载索引运算符以用作设置器,例如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;
};

在此代码中,我希望双精度运算符[](int指数,双系数)为数组获取索引(指数),并将该索引处的值设置为double系数值。

1 个答案:

答案 0 :(得分:2)

您的问题似乎想要两个不同的东西,第一位在注释中得到回答,返回参考。这是完整性的示例,

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;
}

Demo

然后你说..

  

我希望double运算符[](整数指数,双系数)为数组取一个索引(指数),并将该索引处的值设置为double系数值。

您不能将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)];
}

Demo

或者,如果您真的想要逗号,则可以为指数创建自己的类型并重载逗号运算符。

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];
}

Demo

我个人会选择第一个选项,或者改为过载operator()