Niezrozumiałe źródło błędu.

0

Mam za zadanie stworzyć klasę która reprezentuje wielomian n-tego stopnia (przy zadanym n) i wyposażyć ją w operatory dodawania, odejmowania i mnożenia.
Oto mój kod (+ funkcja main sprawdzająca poprawność obliczeń)

#include <iostream>

const int n=3;

class Rn
{
    double *wsk;

    public:
    Rn(void);
    ~Rn(void);
    Rn operator+(Rn &a);
    Rn operator-(Rn &a);
    Rn operator*(Rn &a);
    Rn operator*(double &a);
   friend std::ostream& operator<<(std::ostream &a, Rn b);
   void wczytaj();

};

 Rn::Rn()
    :wsk(new double[n])
    {}

 Rn::~Rn(void)
    {
        delete[]wsk;
        wsk=0;
        std::cout<<"Skasowane";
    }
Rn Rn::operator+(Rn &a)
{
    Rn c;
    for(int i=0;i<n;i++)
        {
        c.wsk[i]=wsk[i]+a.wsk[i];
        }
    return c;
}

Rn Rn::operator-(Rn &a)
{
    Rn c;
    for(int i=0;i<n;i++)
        {
        c.wsk[i]=wsk[i]-a.wsk[i];
        }
    return c;
}
Rn Rn::operator*(Rn &a)
{
    Rn c;
    for(int i=0;i<n;i++)
    {
        c.wsk[i]=0;
        {
            for(int j=0;j<=i;j++)
            {
                c.wsk[i]+=(wsk[j]*a.wsk[i-j]);
            }
        }
    }
    return c;
}

Rn Rn::operator*(double &a)
{
    Rn c;
    for(int i=0;i<n;i++)
    {
       c.wsk[i]=a*wsk[i];
    }
    return c;
}

std::ostream& operator<<(std::ostream &a, Rn b)
{
    if(b.wsk[0]!=0)
        a<<b.wsk[0];
    for(int i=1;i<n;i++)
    {
        if(b.wsk[i]>0)
            a<<"+";
        if(b.wsk[i]!=0)
            a<<b.wsk[i]<<"x^"<<i;
    }
    return a;
}

void Rn::wczytaj()
{
    std::cout<<"Wprowadz "<<n<<" wspolczynników:\n";
        for(int i=0;i<n;i++)
        {
         std::cout<<"a_"<<i<<": ";
         std::cin>>wsk[i];
        }
}


int main(void)
{
    Rn a;
    Rn b;
    a.wczytaj();
    b.wczytaj();
    Rn c;
    std::cout<<"a: "<<a<<"\n"
             <<"b: "<<b<<"\n"
             <<"a+b: "<<a+b<<"\n"
             <<"a-b: "<<a-b<<"\n"
             <<"a*b: "<<a+b<<"\n";
return 0;

}

Niestety za każdym razem po uruchomieniu programu otrzymuje komunikat o błędzie (mimo że wypisywane są poprawne wartości) Nie mam pomysłu na to, co może być przyczyną błędu. (to moje pierwsze "starcie" z dynamiczną tablica jako składnikiem klasy) Może przeoczyłem coś elementarnie prostego?

0

Formatuj kod, bo mało komu będzie się chciało to przeklejać do edytora. Mi się nie chce, więc nawet nie czytałem kodu.
Po drugie: dostajesz komunikat o błędzie? Bardzo fajnie, ale wczoraj w drodze do domu zgubiłem szklaną kulę i nie wiem jaki to błąd niestety.

0

Kompilator Ci automatycznie generuje konstruktor kopiujący, który nie działa tak, jak tego chcesz.

0

To jeszcze będę wdzęczny jak ktoś mi powie w którym momencie ten konstruktor kopiujący się uruchamia i co jest z nim (z grubsza) nie tak.

0

W linijkach "a+b" "a-b" i "a*b" powstają obiekty tymczasowe reprezentujące wynik. Problem w tym, że te tymczasowe obiekty mają wskaźnik wsk ustawiony na taką samą wartość jak obiekt c zdefiniowany w operatorach. Ponieważ obiekt c przestał istnieć to pamięć została zwolniona, a kopia wskaźnika nadal istnieje w obiekcie tymczasowy,.
W momencie niszczenia obiektu tymczasowego, następuje próba ponownego zwolnienia zwolnionej już pamięci co daje twój błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1