用C ++重写多项式的I / O运算符

时间:2015-05-07 16:00:53

标签: c++ operator-overloading

我得到了这个项目,我必须重载i / o运算符来读写多项式。不幸的是,我似乎无法让它发挥作用。

我有头文件:

#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
#include <iostream>

using namespace std;

class Polynomial
{
public:
    Polynomial();

Polynomial(int degree, double coef[]);

int degree;
double coef[ ];
friend istream& operator>>(istream&,Polynomial& );         
friend ostream& operator<<(ostream&,const Polynomial&);    

virtual ~Polynomial();
 };
#endif // POLYNOMIAL_H

和cpp文件:

#include "Polynomial.h"
#include<iostream>
#include<string>

using namespace std;

Polynomial::Polynomial()
{
    //ctor
}

Polynomial::~Polynomial()
{
    //dtor
}

Polynomial::Polynomial(int d, double c[])
{
    degree = d;
    double coef [degree+1];
    for(int i = 0; i < d+1; i++)
    {
        coef[i] = c[i];
    }

}

istream& operator>>(istream& x, const Polynomial& p)
{
    cout<<"The degree: ";
    x>>p.degree;

    for(int i = 0; i < p.degree+1; i++)
    {
        cout<<"The coefficient of X^"<<i<<"=";
        x>>p.coef[i];
    }
    return x;
}

ostream& operator<<(ostream& out, const Polynomial& p)
{
    out << p.coef[0];

    for (int i = 1; i < p.degree; i++)
    {
        out << p.coef[i];
        out << "*X^";
        out << i;
    }

    return out;
}

在名称中,我试图读取多项式,然后写另一个:

#include <iostream>
using namespace std;
#include "Polynomial.h"

int main()
{
    Polynomial p1();
    cin >> p1;

    int degree = 2;
    double coef [3];
    coef[0]=1;
    coef[1]=2;
    coef[3]=3;

    Polynomial p(degree, coef);

    cout<<p;


    return 0;
}

当我运行该程序时,它只是冻结,我似乎无法找到错误。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Polynomial::Polynomial(int d, double c[])
{
    degree = d;
    double coef [degree+1];
    for(int i = 0; i < d+1; i++)
    {
        coef[i] = c[i];
    }

}

在这里,您创建本地数组coef(使用非标准C ++ btw),然后分配给它。你的会员coeff没有被初始化为任何有意义的东西(并且在一开始就没有任何意义)。

而不是double coef[],您应该使用std::vector,如下所示:

struct polynomial {
    std::vector<double> coef;
    // No need for member varaible degree, vector knows its lengths
    polynomial (const std::vector<double> &coeffs) : coef (coeffs) {}
};

然后定义所有其他构造函数,你需要做一些有意义的事情。或者,您可以完全省略构造函数并直接分配系数向量。然后你可以举例如

这样的函数
int degree (const polynomial &p) {
    return p.coef.size() - 1;
}

std::ostream &operator << (std::ostream &out, const polynomial p) {
    if (p.coef.size() == 0) {
        out << "0\n";
        return out;
    }
    out << p.coeff[0];
    for (int i = 1; i < p.coef.size(); ++i)
       out << " + " << p.coef[i] << "*X^i";
    out << "\n";
    return out;
}

答案 1 :(得分:0)

(1)

double coef[];

这是在堆栈上具有未调整大小/动态大小的数组的非标准方法。你最好给数组一些大小,或者让它成为指针并自己分配内存;或使用vector<double>

<强>(2) 您正在构造函数中创建局部变量,这将隐藏类中的成员变量。如果使用指针方法,则需要在构造函数中正确分配它。无论采用哪种方法,您都应该使用零来初始化(成员)变量coef

(3)

Polynomial p1();

这有效地声明了一个名为p1函数,它会返回一个Polynomial而不是一个tyoe Polynomial的变量。您可能想要使用:

Polynomial p1;