【问题标题】:Need help overloading Polynomial class operators C++需要帮助重载多项式类运算符 C++
【发布时间】:2019-12-16 09:31:42
【问题描述】:

我被要求重载这个操作符:p[d],做两件事,

  1. 返回次数为 d 的多项式的系数,因此只需 p[d]。

  2. 将次数为 d 的多项式的系数更改为 p[d]=c。

我使用链表来制作多项式。

这是第一个:

double Polynomial::operator[](const int num)
{    
    Monomial *ptr = NULL;    
    ptr = this->First;    
    while (ptr != NULL)    
    {    
        if (ptr->get_deg() == num)    
        {    
            return ptr->get_C();    
        }    
        ptr = ptr->GetNext();    
    }    
    return 0;    
}    

对于第二个,我正在考虑返回具有相同度数的单项式的地址并更改其系数,但它不起作用,因为我的两个函数都需要获得相同的参数(int 度数)。

这是我的第二个功能:

Monomial& Polynomial::operator[](const int num)
{    
    Monomial *ptr = NULL;    
    ptr = this->First;    
    while (ptr != NULL)    
    {    
        if (ptr->get_deg() == num)    
        {    
            return (*ptr);    
        }    
        ptr = ptr->GetNext();    
    }    
    return;    
}    

这就是它的测试方式,即使这里没有显示第二部分:

cout << "p[0]=" << p[0] << ", p[1]=" << p[1] << ", p[2]=" << p[2] << ", p[4]=" << p[4] << endl;    

【问题讨论】:

  • 你应该在Monomial的实现上添加更多细节,因为如果你只返回Monomial&amp;Monomial没有operator=(double),你将无法做到p[d] = c;.
  • void Monomial::operator=(double cc) { this->c = cc;这是我的 operator= 在 p[d] 之后使用的 Mononomial。
  • 单项式列表是否按幂排序?如果没有,请考虑。第二个函数需要一个单项式(具有正确的度数)来修改,所以如果列表中没有,则应该创建并添加它,然后它可以返回对系数的引用。
  • 它以链表的形式按度排序,抱歉我没有包含大部分代码,它只是很长,我认为发布一个很长的问题不合适。

标签: c++ function overloading


【解决方案1】:

这里不需要两个重载。只需将第一个的返回类型更改为double &amp;

p[d]=c;

会将引用的值(存储在ptr 中的值)更改为c。这只适用于get_C() 当然也返回参考(感谢 Holt 提及)。

另外一点,可能值得一提的是 const 实例,因为您不能修改 const 实例的值。因此,getter 的一种模式如下:

class A {
  private:
    double d;
  public:
    // Overload for const instances, can't modify 'd' via the rturn value
    const double &getD() const { return d; } const;

    // for non-const instances
    double &get() { return d; }
};

所以对于 const 实例(例如 const A a

a.getD() = 3;

无法编译,无法修改 const 引用。对于 A 的非 const 实例,这是可行的,并且会更改成员 d 的实际值。

double d = a.getD();

两者都适用,只需将值复制到局部变量。

【讨论】:

  • 但是如果我只想返回一定程度的系数呢?还有@Holt 所说的,我的 get_C 函数返回一个双精度值。
  • @Holt true,我应该添加这个。
  • @KobiH。我对其进行了一些编辑,希望这能澄清一些事情。
  • 非常感谢,我会复习的。
【解决方案2】:

operator[] 的“规范”实现可以在 cppreference.com 上看到:

struct T
{
          value_t& operator[](std::size_t idx)       { return mVector[idx]; }
    const value_t& operator[](std::size_t idx) const { return mVector[idx]; }
};

如您所见,第二个重载是const-qualified。您不能在非const 对象上调用第一个重载:

const T t;
t[0] = 1; // Error: t is not const, so the second overload is chosen, and you get 
          // a const value_type& you cannot assign to.

根据您的实现,为读取和写入重载返回不同的类型可能是有意义的,因此正确的版本应该是:

// Create a separate function to avoid duplicated code:
Monomial* Polynomial::get_monomial_or_throw(const int num) {    
    Monomial *ptr = this->First;
    while (ptr != nullptr) {
        if (ptr->get_deg() == num) {
            return ptr;
        }    
        ptr = ptr->GetNext();    
    }
    throw std::out_of_range("");
}

// const-qualified version for read-only access:
double Polynomial::operator[](const int num) const {
    return get_monomial_or_throw(num)->get_C();
}

// Not const-qualified version for write access:
Monomial& Polynomial::operator[](const int num) {
    return *get_monomial_or_throw(num);
}

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多