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

destruktor sie nie wywoluje

VPS Starter Arubacloud
0 głosów
455 wizyt
pytanie zadane 19 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)

Dam tylko tą część kodu, która ma znaczenie:

main.cpp:

#include <iostream>
#include "polynomials.h"

using namespace std;

int main()
{
    Wx w;
    Px p;
    Result r;
//for (;;)
//{
    Polynomial *pointerWx;
    Polynomial *pointerPx;
    pointerWx=&w;
    pointerPx=&p;
    pointerWx->gather();
    pointerWx->show();
    pointerPx->gather();
    pointerPx->show();
    r.menu(w, p);
    r.showResult(w, p);
//}    
}

polynomials.h:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
using namespace std;

class Polynomial
{
public:
    virtual void gather()=0;
    virtual void show()=0;
};

class Px;
class Wx;

class Result
{
protected:
    int resultDegree;
    int resultHelper;
    int choice;
    float *resultCoefficients;
public:
    void menu(Wx w, Px p);
    void addition(Wx w, Px p);
    void showResult(Wx w, Px p);
    Result(int=0, int=0, int=0);
    ~Result();

};

class Wx :public Polynomial
{
protected:
    string degreeStringNum;
    int degree;
    int helper;
    float *coefficients;

public:
    virtual void gather();
    virtual void show();
    void isInteger(string &s, int &i);
    friend class Result;

    Wx(string="0", int=0, int=0);
    ~Wx();

};

class Px :public Wx
{
public:
    virtual void gather();
    virtual void show();
    friend class Result;
    Px(string="0", int=0, int=0);
    ~Px();
};

structors.cpp:

#include <iostream>
#include "polynomials.h"

using namespace std;

Wx::Wx(string dNS, int d, int h)
{
    degreeStringNum=dNS;
    degree=d;
    helper=h;
    coefficients=new float[d+1];
    cout<<"Wx constructor called"<<endl;
}
Wx::~Wx()
{
    delete [] coefficients;
    cout<<"Wx destructor called"<<endl;
}

Px::Px(string dNS, int d, int h)
:Wx(dNS, d, h)
{
    coefficients=new float[d+1];
    cout<<"Px constructor called"<<endl;
}
Px::~Px()
{
    delete [] coefficients;
    cout<<"Px destructor called"<<endl;
}

Result::Result(int rD, int rH, int ch)
{
    resultDegree=rD;
    resultHelper=rH;
    choice=ch;
    resultCoefficients=new float[rD+1];
    cout<<"Result constructor called"<<endl;
}
Result::~Result()
{
    delete [] resultCoefficients;
    cout<<"Result destructor called"<<endl;
}

menu.cpp:

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

void Result::menu(Wx w, Px p)
{
    cout<<"Main menu"<<endl;
    cout<<"---------------------"<<endl;
    cout<<"1.Addition"<<endl;
    cout<<"2.Subtraction"<<endl;
    cout<<"3.Multiplication"<<endl;
    cout<<"4.Division"<<endl;
    cout<<"5.Exit"<<endl;
    cout<<endl;
    cout<<"Choose an operation: ";
    cin>>choice;

    switch(choice)
    {
    case 1:
        {
            cout<<"W(x)+P(x) = ";
            addition(w, p);
        }
        break;
    case 2:
        {
            cout<<"W(x)-P(x) = ";
            //subtraction();
        }
        break;
    case 3:
        {

        }
        break;
    case 4:
        {

        }
        break;
    case 5:
        {
            cout<<"Goodbye";
            exit(0);
        }
        break;
    default:
        {
            cout<<"There is no such option";
        }
    }
}

showResult.cpp:

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

void Result::showResult(Wx w, Px p)
{
    if (choice==1 || choice==2 || choice==3 || choice==4 || choice==5)
    {
    for (int i=resultDegree; i>=0; i--)
    {
        if (resultCoefficients[i]>0 && i!=resultHelper)
        {
            cout<<"+";
        }
        if (resultCoefficients[i]==-1 && i!=0)
        {
            cout<<"-";
        }
        if (resultCoefficients[i]!=0)
        {
            if ((resultCoefficients[i]!=1 && resultCoefficients[i]!=-1) || i==0)
            {
                cout<<resultCoefficients[i];
            }
            if (i!=0)
            {
                cout<<"x";
            }
            if (i!=0 && i!=1)
            {
                cout<<i;
            }
        }
        else if (resultCoefficients[i]==0)
        {
            resultHelper--;
        }
        if (i<=0 && resultHelper==-1)
        {
            cout<<"0";
        }
    }
    }
    cout<<endl;
    cout<<endl;
    cout<<"Press enter";
    getchar();getchar();
    system("cls");
}

jest taki output:

Wx constructor called
Wx constructor called
Px constructor called
Result constructor called
Input degree of polynomial W(x): 1
Input coefficients and constant of polynomial W(x):
1
1
W(x)= x+1

Input degree of polynomial P(x): 1
Input coefficients and constant of polynomial P(x):
1
1
P(x)= x+1

Main menu
---------------------
1.Addition
2.Subtraction
3.Multiplication
4.Division
5.Exit

Choose an operation: 1
W(x)+P(x) = Wx destructor called
Px destructor called
Wx destructor called
Wx destructor called
Px destructor called
Wx destructor called
2x+2

Press enter

i po nacisnieciu entera:

Wx destructor called
Px destructor called
Wx destructor called
Result destructor called
Px destructor called
Wx destructor called
Wx destructor called

Process returned 0 (0x0)   execution time : 26.947 s
Press any key to continue.

a gdy zamkne w nieskonczona petle w mainie program (zmaze komentarze) to mam tak:

Wx constructor called
Wx constructor called
Px constructor called
Result constructor called
Input degree of polynomial W(x): 1
Input coefficients and constant of polynomial W(x):
1
1
W(x)= x+1

Input degree of polynomial P(x): 1
Input coefficients and constant of polynomial P(x):
1
1
P(x)= x+1

Main menu
---------------------
1.Addition
2.Subtraction
3.Multiplication
4.Division
5.Exit

Choose an operation: 1
W(x)+P(x) = Wx destructor called
Px destructor called
Wx destructor called
Wx destructor called
Px destructor called
Wx destructor called
2x+2

Press enter

i po nacisnieciu entera:

Wx destructor called
Px destructor called
Wx destructor called
Input degree of polynomial W(x):

nawet resultDestruktor nie zadzwonil, jak to rozwiazac? bo chcialbym zeby to bylo zapetlone a nie chce zeby doszlo do memory leaku, no i nawet jak to nie jest zapetlone to nie dziala tak jakbym chcial, bo program najpierw maze ekran konsoli a potem dopiero wywoluja sie te ostatnie destruktory, jak dam system("cls") do destruktora Result to nawet nie maze ekranu bo sie nie wywoluje ;p

2 odpowiedzi

+1 głos
odpowiedź 19 sierpnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

Destruktor obiektu r nigdy nie jest uruchamiany w trakcie pracy pętli for z maina, bo r żyje dłużej niż ta pętla. Jak chcesz, żeby po każdym pełnym obiegu pętli r było niszczone i ponownie tworzone na początku pętli, to przesuń sobie linijkę 10. z maina do środka pętli. W obecnym kodzie r jest niszczone dopiero na koniec funkcji main.

I to obecne rozwiązanie jest w ogóle w miarę ok jeżeli chodzi o zabezpieczanie przed wyciekami pamięci. Tzn. tworzysz obiekt r, rusza konstruktor i alokuje pamięć. Korzystasz sobie z tego, drukujesz nawet wielokrotnie w pętli, a jak się już pobawiłeś, to pętla się kończy, main się kończy i rusza destruktor. Zwalnia pamięć i wszystko gra, nie ma wycieków :) A napisałem, że to rozwiązanie jest w "miarę ok", a nie że jest dobre, bo dobre by tutaj było zastosowanie Rule of Zero ;)

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

W takim razie jeżeli mam nie pisać const w argumencie

A gdzie ja napisałem, że masz nie pisać const? Można i tak, i tak. Na ogół przekazuje się z const, bo z reguły argumenty funkcji są read-only. Dodatkowo użycie tego kwalifikatora daje możliwość użycia wartości tymczasowych (r-wartości).

to ma to wyglądać po prostu w ten sposób tak:?

Przeczytałeś linka, którego dałem w poprzednim komentarzu?

komentarz 23 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
Tak przeczytałem i jest tam tak jak napisalem
komentarz 23 sierpnia 2020 przez j23 Mędrzec (194,920 p.)
Nie ma.

Przeczytaj jeszcze raz ze zrozumieniem. Przeanalizuj kod.
komentarz 24 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
ok jestem debilem ogolnie, ale chyba tez wzrokowcem i potrzebowalem obejrzec o tym na yt niz tylko przeczytac, ogolnie posylajac wszystko przez const referencje to nie wywola sie nigdy copy constructor tak? takto po co go definiowalem i tak samo move constructor i oba operatory
1
komentarz 24 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

ogolnie posylajac wszystko przez const referencje to nie wywola sie nigdy copy constructor tak?

Tak, po to przesyłasz przez referencję, by nie kopiować.

to po co go definiowalem

Wspomniana Rule of Three/Five. Mógłbyś oczywiście dać takie deklaracje:

Result(const Result &) = delete; 
Result& operator=(const Result&) = delete; 

Wtedy obiekt klasy Result byłby niekopiowalny/nieprzenoszalny, ale zapewne w trakcie pisania programu okazałoby się, że jednak możliwość kopiowania jest potrzebna.

–1 głos
odpowiedź 19 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
Nie lepiej użyć po prostu zwykłego wskaźnika ?
komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
tzn? jakiego wskaznika?
komentarz 19 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
No nie wiem, na klasę?
komentarz 19 sierpnia 2020 przez lujasjeden Użytkownik (860 p.)
Prosze tlumaczyc jak dla laika, bo to pierwszy moj projekt oop i nigdy wczesniej nie uzywalem konstruktorow, destruktorow itp i troche sie w tym gubie. Co mi da uzycie wskaznika na klase (ktora?) w tej sytuacji?

Podobne pytania

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

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...