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

Destruktor c++

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
265 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 (195,260 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 951 wizyt
pytanie zadane 19 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)
0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Quegon23 Nowicjusz (150 p.)
+1 głos
2 odpowiedzi 196 wizyt
pytanie zadane 19 października 2015 w C i C++ przez Dash Nałogowiec (29,650 p.)

93,158 zapytań

142,171 odpowiedzi

321,881 komentarzy

62,487 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 224p. - nidomika
  2. 224p. - Marcin Putra
  3. 223p. - dia-Chann
  4. 221p. - ssynowiec
  5. 217p. - Mikbac
  6. 216p. - CC PL
  7. 215p. - Łukasz Piwowar
  8. 212p. - zmmz89
  9. 210p. - Adrian Wieprzkowicz
  10. 208p. - rafalszastok
  11. 206p. - Michal Drewniak
  12. 204p. - Łukasz Eckert
  13. 202p. - rucin93
  14. 200p. - robwarsz
  15. 198p. - TheLukaszNs
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...