2015-04-18 22 views
1

我正在为我的C++类工作,并且在运行程序时遇到了一些小问题。调试时出现错误,说明Unhandled exception at 0x000944C8 in Pog11.exe: 0xC0000005: Access violation writing location 0x00000000.。目标是读取多项式的int度数以及double系数。 这里要说的是我提供的.h文件中:多项式代码

#ifndef POLYNOMIAL_H 
#define POLYNOMIAL_H 

#include<iostream> 
using std::ostream; 
using std::istream; 
using std::cerr; 
using std::endl; 

class Polynomial 
{ 
    friend ostream& operator<<(ostream& left , const Polynomial& right); 
    friend istream& operator>>(istream& left , Polynomial& right); 

public: 
    Polynomial(); 
    Polynomial(int degree, const double* coefficients); 
    Polynomial(const Polynomial&); 
    ~Polynomial(); 

    const Polynomial& operator=(const Polynomial& deg); 
    bool operator==(const Polynomial& deg) const; 
    void setDegree(int d); 
    int getDegree() const; 

private: 
    int degree; 
    double* coefficients;   
}; 
#endif 

而且这里的代码导致该错误的段:

istream& operator>>(istream& left, Polynomial& right) 
{ 
    int tmp; 
    left >> tmp; 
    right.setDegree(tmp); 
    int i = 0; 
    while (i<=right.getDegree()) 
    { 
     double co; 
     left >> co; 
     right.coefficients[i] = co; 
     i++; 
    } 
    return left; 
} 

具体的right.coefficients[i]=co;线是什么原因导致程序崩溃。

下面是类构造函数:

#include "Polynomial.h" 
Polynomial::Polynomial() :degree(0), coefficients(0) 
{ 
degree = 0; 
coefficients = new double[degree]; 

} 
Polynomial::Polynomial(int deg, const double* coefficients) 
{ 
if (deg < 0) 
{ 
    degree = 0; 
} 
else 
{ 
    degree = deg; 
} 
coefficients = new double [degree]; 
} 
Polynomial::Polynomial(const Polynomial& deg) 
{ 
if (deg.getDegree() <= 0) 
{ 
    setDegree(0); 
} 
else 
{ 
    setDegree(deg.getDegree()); 
    for (int i = 0; i < degree; i++) 
    { 
     coefficients[i] = deg.coefficients[i]; 
    } 
} 
} 
+0

请提供[MCVE](http://www.stackoverflow.com/help/mcve)。 “系数”如何初始化?问题在于未包括在问题中的代码。 – Barry

回答

1

有遗漏码 - 例如执行Polynomial对象的构造函数。

我很肯定你的错误是你没有为coefficients数据成员分配足够的内存。必须有一个

coefficients = new double[number_of_coeffs] 

在您的代码中的某处。

编辑

有一个号码,你需要做到这几点:在多项式的程度是(重新)集。因为你知道多项式的程度:

在这里,你必须复制传递的元素:

Polynomial(int degree, const double* coefficients): 
    coefficients(new double[degree]), degree(degree) 
{ 
    ::memcpy(this->coefficients, coefficients, degree * sizeof(double)); 
} 

而在这其中,的多项式变化的程度 - 所以你的系数数组必须做相应的修改。

Polynomial::setDegree(int degree) { 
    // first delete the old coefficients 
    delete [] coeffs; 
    // and make a new array 
    this->degree = degree; 
    this->coefficients = new double[ this->degree ]; 
    // initialize the coefficients 
    .. 
} 

在复制构造函数和赋值运算符中必须执行类似的操作。

最后:你可能会更好使用std::vector<double>,它基本上为你做所有的内存管理。请参阅http://en.cppreference.com/w/cpp/container/vector

+0

感谢您的回复!你会在哪里推荐这条新路线?我在编码方面还是比较新的,但我仍然试图让所有的东西都变得清晰。谢谢 – drade13