【问题标题】:Overloading the I/O operators for a linked list重载链表的 I/O 操作符
【发布时间】:2015-04-16 13:59:41
【问题描述】:

我试图通过重载输入和输出运算符来读取和打印表示为链表的多项式。我必须重载它们两次:一次在类节点中(用于读取和打印单个节点),另一次在类多项式中(使用已经实现的节点 I/O 重载)。 但是,我用来重载多项式 I/O 的友元函数无法访问类节点的私有成员(类是类多项式的友元)。

函数“inserare”只是向多项式添加一个节点。 我的代码:

using namespace std;
class nod
{
    friend class polinom;
    int exp,coef;
    nod *urm;
    friend ostream &operator<<( ostream &output, const nod &X );
    friend istream &operator>>( istream &input, nod &X );
};
ostream &operator<<( ostream &output, const nod &X )
{
    if(X.coef==0) output<<0;
    else if(X.exp==0)
    {
        if(X.coef>0) output<<"+"<<X.coef;
        else output<<X.coef;
    }
    else if(X.coef>0)
    {
        if(X.coef==1&&X.exp==1) output<<"+"<<"x";
        if(X.coef==1&&X.exp!=1) output<<"+"<<"x^"<<X.exp;
        if(X.coef!=1&&X.exp==1) output<<"+"<<X.coef<<"*x";
        if(X.coef!=1&&X.exp!=1) output<<"+"<<X.coef<<"*x^"<<X.exp;
    }
    else
    {
        if(X.coef==-1&&X.exp==1) output<<"-"<<"x";
        if(X.coef==-1&&X.exp!=1) output<<"-"<<"x^"<<X.exp;
        if(X.coef!=-1&&X.exp==1) output<<X.coef<<"*x";
        if(X.coef!=-1&&X.exp!=1) output<<X.coef<<"*x^"<<X.exp;
    }
    return output;
}
istream &operator>>( istream &input, nod &X )
{
    input>>X.coef;
    input>>X.exp;
    X.urm=NULL;
    return input;
}
class polinom
{
    nod *prim,*curent;
public:
    polinom();                                      //constructor
    ~polinom();                                     //destructor
    polinom(const polinom& p);                      //copy constructor
    void inserare(nod *aux);
    friend ostream &operator<<( ostream &output, const polinom &X );
    friend istream &operator>>( istream &input, polinom &X );
};

ostream &operator<<( ostream &output, const polinom &X )
{
for(nod* temp = X.prim; temp!= NULL; temp = temp->urm)
    output<<temp;
    return output;
}
void polinom::inserare(nod *aux)
{
    if(prim==NULL&&aux->coef==0)
    {
        prim=aux; 
        curent=prim;
    }
    if(aux->coef)
    {
        if(prim==NULL||prim->exp>aux->exp) 
        {
            aux->urm=prim;
            prim=aux;
            curent=prim;
        }
        else 
        {
            curent=prim;
            while(curent->urm&&curent->urm->exp<=aux->exp)
            {
                curent=curent->urm;
            }
            if(curent->exp==aux->exp)
            {
                curent->coef=curent->coef+aux->coef;
                return;
            }
            if(curent->urm==NULL) curent->urm=aux;
            else
            {
                aux->urm=curent->urm;
                curent->urm=aux;
                return;
            }
        }
    }
}
istream &operator>>( istream &input, polinom &X )
{
    nod temp;
    do
    {
        input>>temp;
        X.inserare(&temp);
    }
    while(temp.coef);
    return input;
}

【问题讨论】:

  • 在这部分代码ostream &amp;operator&lt;&lt;( ostream &amp;output, const polinom &amp;X ) { for(nod* temp = X.prim; temp!= NULL; temp = temp-&gt;urm) output&lt;&lt;temp; return output; } 你可能想取消对 temp 的引用。

标签: c++ input linked-list operator-overloading


【解决方案1】:

您需要另一组friend 声明,以便polynom 的提取器/插入器可以访问节点的数据成员:

class nod
{
    friend class polinom;
    int exp,coef;
    nod *urm;

    friend ostream &operator<<( ostream &output, const nod &X );
    friend istream &operator>>( istream &input,        nod &X );

    friend ostream &operator<<( ostream &output, const class polinom &X );
    friend istream &operator>>( istream &input,        class polinom &X );
};

【讨论】:

  • 我也有一个问题,因为我重载了类 'nod' 的提取器,但是当我尝试打印多项式时它崩溃了,因为多项式的元素是 '*nod'。我如何打印这些?我需要将提取器从打印“点头”更改为打印“*点头”吗?
  • @user3057352 您可能希望它打印点头。我可以在您的polynom 插入器中看到您正在执行output&lt;&lt;temp;,它将打印指针而不是实际节点。我不知道崩溃是从哪里来的。您应该使用调试器,如果一切都失败了,请发布另一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多