微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类链表的复制构造函数不起作用

如何解决类链表的复制构造函数不起作用

我的复制构造函数引用了另一个地址而不是复制值,你们能帮我找到问题吗?

这是复制构造函数

poly::poly(const poly& copyList)
{

    // copy the first term
    power = copyList.power;
    coef = copyList.coef;

    if (copyList.nextTerm == NULL)
    {
        nextTerm = NULL;
    }
    else
    {
        // copy the next term
        polyPtr trackcopy = copyList.nextTerm;
        nextTerm = new poly;
        polyPtr trackOriginal = nextTerm;
        polyPtr newTerm;

        while (trackcopy != NULL)
        {
            newTerm = new poly;
            newTerm->coef = trackcopy->coef;
            newTerm->power = trackcopy->power;
            trackOriginal->nextTerm = newTerm;
            trackOriginal = newTerm;

            trackcopy = trackcopy->nextTerm;

        }   
    }

}

这里的copyList是一个类,其私有成员变量为coef、power和一个nextTerm,指向列表的下一个节点

poly 的界面如下:

class poly
{
    public:
        // constructors
        poly();
        poly(int constant);
        poly(int coef,int power);
        poly(const poly& copyList);

        // set functions
        void setPower(int number);
        void setCoef(int number);
        void setNextTerm(poly* link);

        // member function to compute
        int evaluate(int x);


    private:
        int power;
        int coef;
        poly* nextTerm;

};
typedef poly* polyPtr;

示例如下:

int main()
{
    polyPtr polyNomial = new poly(2,3);
    polyPtr nextTerm = new poly(5,8);

    polyNomial->setNextTerm(nextTerm);

    polyPtr copyTerm(polyNomial);

    polyPtr newTerm = new poly(1,2);
    copyTerm->setNextTerm(newTerm);

    cout << copyTerm->evaluate(3) << endl;

    cout << polyNomial->evaluate(3) << endl;


    return 0;
}

在这里,我预计 copyTerm 和 polyNomial 的评估不同,但它们是相同的

解决方法

您的复制构造函数有错误。我添加了这个 friend 函数来显示链接列表和一个小程序来创建 Poly 并复制它们:

std::ostream& operator<<(std::ostream& os,const Poly& p) {
    const Poly* n = &p;
    os << '{';
    do {
        os << "addr:" << n << ' ' << n->power << ',' << n->coef << ' ';
        n = n->nextTerm;
    } while(n);
    return os << '}';
}

int main() {
    Poly p(1,2);
    p.setNextTerm(new Poly(3,4));

    std::cout << "orig: " << p << '\n'; // display the original
    Poly c(p);                          // copy construction
    std::cout << "copy: " << c << '\n'; // display the copy
}

注意副本中插入了零的额外 Poly

orig: {addr:0x7ffcf2af8cd0 2,1 addr:0x1447eb0 4,3 }
copy: {addr:0x7ffcf2af8ce0 2,1 addr:0x1448ee0 0,0 addr:0x1448f00 4,3 }

如果你像这样简化复制构造函数:

Poly::Poly(const Poly& rhs) : power(rhs.power),coef(rhs.coef),nextTerm(nullptr) {
    for(Poly *prev = this,*next = rhs.nextTerm; next; next = next->nextTerm) {
        prev->nextTerm = new Poly(next->coef,next->power);
        prev = prev->nextTerm;
    }
}

输出将是这样的:

orig: {addr:0x7ffdfe4b2eb0 2,1 addr:0x1f15eb0 4,3 }
copy: {addr:0x7ffdfe4b2ec0 2,1 addr:0x1f16ee0 4,3 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。