【问题标题】:Overloading the += operator in a class for a Node member为 Node 成员重载类中的 += 运算符
【发布时间】:2012-12-01 07:35:40
【问题描述】:

我正在尝试在我的程序中重载 += 运算符。它由一个多项式类组成,该类包括一个 int 次数(多项式的最高次数)和一个 Node* Poly(指向节点的指针)

struct Node{ int coefficient;
             Node* next; };

那是我的节点结构,不过我在多项式类中重载。

  Polynomial& Polynomial::operator +=(const Polynomial& rP){
    Polynomial copyRP(rP);
    poly->coefficient = poly->coefficient + copyRP.poly->coefficient;
    poly = poly->next; //if I take this and
    copyRP.poly = copyRP.poly->next; //this away, it runs fine
    //with it however the program compiles but doesnt work 
    return *this;
  }

节点包含向后的系数列表,如果这很重要的话。例如 3x^2+2x+5 在节点中存储为 5->2->3 并且度数为 2。

【问题讨论】:

  • 那么多项式类的定义是什么?它是如何“不工作”的?为什么你需要那些你说它可以正常工作的线条?为什么operator+= 会复制任何东西?
  • 我做了一个副本,因为rP.poly = rP.poly->next 会说不能修改左值,如果我保留poly = poly->nextcopyRP.poly = copyRP.poly->next,它就不起作用,我忘了把while(poly != NULL) 放到通过整个节点添加,但我在我的程序中有它
  • 差不多,如果我有两个多项式,一个是3x^2+2x+2和2x^2+3x+4,我想返回5x^2+5x+6,加上这两个多项式,但每当我尝试return *this 时,它不会让我,但是如果我复制this,它会让我返回副本,我不明白!
  • oo 和 class Polynomial{private: int degree; Node* poly};

标签: c++ operators overloading nodes


【解决方案1】:

试试这个:

struct polynomial {
    std::vector< int > coeffs;
    std::size_t degree() const { return coeffs.size(); }
};

polynomial &polynomial::operator+= ( polynomial &lhs, polynomial const &rhs ) {
    if ( lhs.degree() < rhs.degree() ) lhs.coeffs.resize( rhs.degree() );
    for ( std::size_t k = 0; k != rhs.degree(); ++ k ) {
        lhs.coeffs[ k ] += rhs.coeffs[ k ];
    }
    return lhs;
}

没有链表,没有手动内存管理,你可以很容易地把它改成另一种数字类型。

【讨论】:

  • 我希望我能!!!我正在学习一个 c++ 课程,这是硬件的一部分,硬件的重点是要有一个像我一样的节点,我不能改变那个 =(
  • @user1828659 啊,你没提到。请注意,当您可以使用标准库时,编写一个链表是一个非常的坏主意。正如您所观察到的,这会导致程序不稳定。有这样的项目表明你的班级给了你糟糕的、无用的建议。
  • 我知道该怎么做了!我只需要做Node* p = polyNode* r = rP.poly 就可以了,无论如何感谢您的帮助!使用链表并不总是一个坏主意,它们以自己的方式有用。
  • @user1828659 你不需要一个链表来使用一个链表。 std::list 是这种情况下的解决方案,您可以简单地将这段代码中的 vector 替换为 list 来实现。这就是利用图书馆的力量。不好的建议与特定的数据结构无关,不好的建议是在库可用时编写任何数据结构。您可以在整个职业生涯中完全不实现任何数据结构,而您确实需要实现的那些(由于更高的复杂性)通常需要使用库才能做到正确。
  • 我明白了,非常感谢您的意见!我不知道list 是我可以使用的东西,我猜我的教授正在向我们展示做事的各种方法,尽管我认为对于编程来说,展示做某事的最佳方法会更多高效的。无论如何,我真的很感激所有的意见!再次感谢您的帮助,我一定会调查的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多