【问题标题】:Cannot add term to a listed list class无法将术语添加到列出的列表类
【发布时间】:2018-03-29 18:35:54
【问题描述】:

我正在尝试创建一个多项式类。应该对每个对象的术语进行排序以便于使用(从较高的指数到较小的指数)。所以我在addTerm 方法中进行了排序,但我在正确操作时遇到了一些麻烦。我要么创建一个无限链表,要么事情没有正确排序

#include <iostream>

using namespace std;

class Polynomial {
protected:
    class Term {
    public:
        int exponent;
        int coefficient;
        Term *next;

        Term(int exp, int coeff, Term *n) {
            exponent = exp;
            coefficient = coeff;
            next = n;
        }
        friend class Polynomial;
    };

public:
    Polynomial() {
        root = NULL;
    }
    Polynomial(const Polynomial &p) {
        root = p.root;
    }
    ~Polynomial() {
        root = NULL;
    }
    void addTerm(int expon, int coeff) {

        Term *prev = root;
        Term *target = root;

        if (root == NULL) {
            Term tmp = Term(expon, coeff, NULL);
            Term *p = &tmp;
            root = p;

            return;
        }

        while (target!= NULL && target->exponent < expon) {
            prev = target;
            target = target->next;
        }

        if (prev == target){
            Term tmp = Term(expon, coeff, target;
            Term *p = &tmp;
            prev->next = p;
        }else{


        Term tmp = Term(expon, coeff, target);
        Term *p = &tmp;
        prev->next = p;

        }




    }



private:
    Term *root;
};

int main() {
    Polynomial q;
    q.addTerm(1, 4);
    q.addTerm(2, 3);
    q.addTerm(3, 4);
    //q.addTerm(1, 4);
    //q.addTerm(2, 4);
    // q.addTerm(2,4);
    //q.print();
    //cout << q;
}

【问题讨论】:

  • 分离关注点。多项式类都与列表的实现纠缠在一起。使用列表类型来构建多项式类型。最好使用标准 STL 容器,例如 std::list。如果愚蠢的讲师不允许这样做,请使用标准列表容器测试您的多项式代码以实现它,然后尝试滚动您自己的列表替换。
  • 主类和子类方法都应该是原样..
  • 如果你的意思是你的教练说你必须这样做,那太可惜了。请记住,他是在告诉你做得不好。买一本好书。
  • 我的意思是我们只写每个方法的内部而不是名称和它们的变量......因为它们从分级机传递......另外我的导师在谷歌为 V8 js 引擎工作所以我不能正确解释这一点
  • 我不明白你的意思,但没关系。询问您的导师是否可以使用标准列表,如果不能(不太可能给出他的凭据),是否可以编写单独的列表类并将其合并到多项式中。

标签: c++ oop linked-list abstract


【解决方案1】:

这里有很多错误。我将列举一些我看到的东西,但我不认为我会抓住一切......

1。不要使用NULL

在默认构造函数中设置root == NULL;。不。请参阅here 了解更多信息。

2。您的复制构造函数会进行浅拷贝。

root = p.root; 表示两个root 都指向同一个列表!这意味着修改一个将修改另一个,这将导致一些令人讨厌的意外。您需要创建一个deep copy

3。你的析构函数不会释放任何东西!

您再次将root 设置回空指针并结束函数。这相当于把垃圾袋拿出来放在罐子旁边,然后考虑清理垃圾。你有内存泄漏!

4。你的指针都指向坏对象!

Term tmp = Term(expon, coeff, NULL);
Term *p = &tmp;
root = p;

是的!你在本地分配一个Term 并给root 它的地址。但在该函数结束后,tmp 超出范围并被销毁,留下 root 指向无效的内存位置!您需要动态分配将在对象生命周期内持续存在的内存。

【讨论】:

  • 1.所以你说使用0? 2.我知道暂时我不在乎......:P 3.我该怎么做? 4.我试过Term tmp = new(expon, coeff, target);但我得到一个错误
  • @StavrosAvramidis 1. 如果可以,请使用0nullptrNULL 已被弃用,因此您无法保证它是有效的。 3.new 的每次调用都需要对delete 的匹配调用(否则您有泄漏)。您需要在分配的每个 Term 上循环并调用 delete。 4. 试试Term *tmp = new Term(expon, coeff, target);
猜你喜欢
  • 2020-12-28
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多