0

FunctionクラスからPolynomialクラスを派生させるプログラムに取り組んでいます。私はほぼ完成していますが、最後の問題に直面しています。

「=」演算子を呼び出しています。関数mainでは、次のようになります。

f3 = f2 * 2;

f3とf2はどちらも多項式データ型です。乗算演算子もオーバーロードされており、動作することがテストされています。私のプログラムがこのポイントに達すると、クラッシュします。クラッシュのバックトレースは次のとおりです。

Program received signal SIGABRT, Aborted.
0x00000000 in ?? ()
(gdb) bt
#0  0x00000000 in ?? ()
#1  0x77cbf8c1 in ntdll!RtlUpdateClonedSRWLock ()
   from /cygdrive/c/Windows/system32/ntdll.dll
#2  0x75ab0816 in WaitForSingleObjectEx ()
   from /cygdrive/c/Windows/syswow64/KERNELBASE.dll
#3  0x000000ec in ?? ()
#4  0x00000000 in ?? ()

残念ながら、それは私にヒントを提供しません。

最後に、オーバーロードされた演算子=:です。

    Polynomial& Polynomial::operator=(const Polynomial& rhs) {
if(this->a)
    delete [] this->a;
this->setName(rhs.getName());
this->degree = rhs.degree;
a = new double[this->degree];
for(int i = 0; i < this->degree; i++)
{
    this->a[i] = rhs.a[i];
}
return *this;
}

そして、クラスのヘッダーファイル。

    class Polynomial : public Function
{
    public:
                    Polynomial (const string& name = "unnamed");
                    Polynomial (const Polynomial& rhs);
        void        setCoefficients (int degree, ...);
        int         getDegree() const { return degree; }
        double      operator[] (int i) const;
        double      operator() (double x) const;
        Polynomial  operator* (double c) const;
        Polynomial& operator*= (double c);
        Polynomial& operator=(const Polynomial& rhs);
        void        write(ostream& outfile) const;

    private:
        double*    a;
        int        degree;
};
Polynomial operator* (double c, const Polynomial& p);

コンストラクター:

   (Polynomial::Polynomial (const string& name) {
    a = new double[1];
    a[0] = 0;
    degree = 0;
    return;
    }

Polynomial::Polynomial (const Polynomial& rhs) {

    //Null a, and then pass over to the overloaded = operator.
    if(this->a)
        delete [] this->a;
    *this = rhs;
    return;
    }

必要なだけコードを共有したいと思います。助けてくれてありがとう!

4

2 に答える 2

1

問題はコピーコンストラクターにあると思います。コピーコンストラクターには次のようなものがあります。

//Null a, and then pass over to the overloaded = operator.
if(this->a)
    delete [] this->a;

ただしa、ここでは初期化されていないため、削除できないため、次のように置き換えます。

Polynomial::Polynomial(Polynomial const& other) : a( NULL ) {...}
于 2012-11-30T05:55:08.757 に答える
1

コンストラクターとコピーコンストラクターの両方に問題があります。コピーコンストラクターは、通常のコンストラクターとして何もないところからオブジェクトを構築しているため(ただし、対応する値を他のオブジェクトからコピーします)、そこで値をチェックするのではなく、作成するだけです。空白の戻り演算子は必要ありません。また、aのサイズが0と1の場合の不確実性に問題があります。このコードはより一般的です:

Polynomial::Polynomial (const string& name) : Function(name) {
    a = 0;
    degree = 0;
}

Polynomial::Polynomial (const Polynomial& rhs) {

    setName(rhs.getName());
    degree = rhs.degree;
    if(degree)
    {
        a = new double[degree];
        for(int i = 0; i < degree; i++)
            a[i] = rhs.a[i];
    }
    else
        a = 0;
}

const Polynomial& Polynomial::operator=(const Polynomial& rhs) {
    if(this != &rhs)
    {
        if(a)
            delete [] a;
        setName(rhs.getName());
        degree = rhs.degree;
        a = new double[degree];
        for(int i = 0; i < degree; i++)
            a[i] = rhs.a[i];
    }
    return *this;
}
于 2012-11-30T05:23:59.503 に答える