• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Destruktor c++

Object Storage Arubacloud
0 głosów
223 wizyt
pytanie zadane 7 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)

Witam, piszę kalkulator wielomianów, właściwie drugi raz bo teraz chcę to zrobić "ładniej" i nie jestem pewny co mam wpisać w destruktor. 

main.cpp:

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

int main()
{
    Result r(0,0);
    r.gatherWxPx();
    return 0;
}

result.h:

#include <iostream>

using namespace std;

class Result
{
private:

    int dWx; //degree of polynomial W(x)
    int dPx; //degree of polynomial P(x)

public:

    void gatherWxPx(); //gathering polynomial W(x) from user
    Result(int, int);
    ~Result();

    void addition(); //adding polynomials
    void subtraction(); //subtracting polynomials
    void multiplication(); //multiplying polynomials
    void division(); //dividing polynomials
};

gather.cpp:

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

void Result::gatherWxPx()
{
    cout<<"Input degree of polynomial W(x): ";
    cin>>dWx;
    while (dWx<=0)
    {
        cout<<"Degree of polynomial has to be greater than 0, try again: ";
        cin>>dWx;
    }
    int HelperWx=dWx;

    cout<<"Input degree of polynomial P(x): ";
    cin>>dPx;
    while (dPx<=0)
    {
        cout<<"Degree of polynomial has to be greater than 0, try again: ";
        cin>>dPx;
    }
    int HelperPx=dPx;

    float *cWx;                  //
    cWx = new float [dWx+1];     //dynamically allocating arrays for W(x)

    cout<<"Input coefficients and constant of polynomial W(x): ";
    cout<<endl;

    for (int i=dWx; i>=0; i--)
    {
        cin>>cWx[i];     //gathering coefficients of W(x)
    }

    cout<<"W(x)= ";              //show W(x)
    for (int i=dWx; i>=0; i--)
    {
        if (cWx[i]>0 && i!=HelperWx)
        {
            cout<<"+";
        }
        if ((cWx[i]<0 && i==0 && i==dWx) || cWx[i]==-1)
        {
            cout<<"-";
        }
        if (cWx[i]!=0)
        {
            if ((cWx[i]!=1 && cWx[i]!=-1) || i==0)
            {
                cout<<cWx[i];
            }
            if (i!=0)
            {
                cout<<"x";
            }
            if (i!=0 && i!=1)
            {
                cout<<i;
            }
        }
        else if (cWx[i]==0)
        {
            HelperWx--;
        }
        if (i<=0 && HelperWx==-1)
        {
            cout<<"0";
        }
    }

    cout<<endl;

    delete [] cWx;

    float *cPx;               //
    cPx = new float [dPx+1];  //dynamically allocating arrays for P(x)
    //

    cout<<"Input coefficients and constant of polynomial P(x): ";
    cout<<endl;

    for (int i=dPx; i>=0; i--)
    {
        cin>>cPx[i];      //gathering coefficients of P(x)
    }

    cout<<"P(x)= ";             //show P(x)
    for (int i=dPx; i>=0; i--)
    {
        if (cPx[i]>0 && i!=HelperPx)
        {
            cout<<"+";
        }
        if ((cPx[i]<0 && i==0 && i==dPx) || cPx[i]==-1)
        {
            cout<<"-";
        }
        if (cPx[i]!=0)
        {
            if ((cPx[i]!=1 && cPx[i]!=-1) || i==0)
            {
                cout<<cPx[i];
            }
            if (i!=0)
            {
                cout<<"x";
            }
            if (i!=0 && i!=1)
            {
                cout<<i;
            }
        }
        else if (cPx[i]==0)
        {
            HelperPx--;
        }
        if (i<=0 && HelperPx==-1)
        {
            cout<<"0";
        }
    }
    cout<<endl;
    delete [] cPx;
}

Result::Result(int Wx, int Px)
{
    dWx=Wx;
    dPx=Px;
}

Result::~Result()
{
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

Mój plan na program to stworzenie w osobnych plikach funkcji dodawania, odejmowania, mnozenia i dzielenia i wywolanie w mainie:

gatherWxPx()

switch z wszystkimi operacjami (dodawanie, odejmowanie, mnozenie, dzielenie)

zapetlony caly program aby sie nie wylaczal po 1 obliczeniu

I teraz pytanie: Co mam umiescic w destruktorze funkcji gatherWxPx?

Mógłbym tam dać delete [] cWx oraz delete [] cPx, ale czy moge tak zrobic? Nie wiem jak to dokladnie dziala prosze o wytlumaczenie ale na moje myslenie to jak to usune to nie bede mogl pozniej wykonywac zadnych operacji, tak czy nie? Poza tym w innych funkcjach bede mial tez inne destruktory  zapewne, chociaz nie wiem jak to dziala do konca, ale bede musial dynamicznie alokowac nowe szufladki np dla wyniku dodawania.

Destruktor znajduje sie na samym dole i jest zaznaczony wykrzyknikami.

komentarz 7 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

teraz chcę to zrobić "ładniej"

To pozbądź się tych new[] i delete[] na rzecz std::vector.

1 odpowiedź

+1 głos
odpowiedź 7 sierpnia 2020 przez Michałełe Nałogowiec (25,600 p.)

to jak to usune to nie bede mogl pozniej wykonywac zadnych operacji, tak czy nie?

Jak dasz delete to zdealokujesz zajętą pamięć - nie będziesz mógł na niej operować, ale ten wskaźnik będziesz mógł ustawić aby wskazywał na coś innego

Poza tym w innych funkcjach bede mial tez inne destruktory  zapewne,

W funkcjach nie ma destruktorów - są tylko w klasach, i odpalają się one same (implicit) przed zniszczeniem obiektu (można też odpalić jawnie destruktor, ale to bardzo rzadko się zdarza)

 

A co do kodu, rzuciłem okiem i ty już dealokujesz za pomocą delete w tej funkcji gatherWxPx, także będzie to błąd jeśli zrobisz to ponownie

komentarz 7 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
Co do tego że już mam delete to wiem ale właśnie chodziło mi czy go usunąć i dać w destruktorze, ale chyba powinienem zrobić tak że wywołam konstruktor na początku w mainie potem wywołam funkcje gatherWxPx, potem dam switcha do wyboru jednej z 4 operacji a na końcu dam destruktor który posprząta wszystkie dynamicznie zaalokowane tablice. I tak będzie się wywoływać w kółko bo program będzie zapętlony, tylko czy tak mogę? W ogóle konstruktora i destruktora dać w osobnych plikach?

Podobne pytania

0 głosów
2 odpowiedzi 458 wizyt
pytanie zadane 19 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Quegon23 Nowicjusz (150 p.)
+1 głos
2 odpowiedzi 171 wizyt
pytanie zadane 19 października 2015 w C i C++ przez Dash Nałogowiec (29,650 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...