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

destruktor sie nie wywoluje

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

93,185 zapytań

142,199 odpowiedzi

322,008 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2127p. - dia-Chann
  2. 2092p. - Łukasz Piwowar
  3. 2079p. - Łukasz Eckert
  4. 2037p. - Tomasz Bielak
  5. 2006p. - rucin93
  6. 2005p. - Łukasz Siedlecki
  7. 1964p. - CC PL
  8. 1835p. - Adrian Wieprzkowicz
  9. 1785p. - Michal Drewniak
  10. 1744p. - rafalszastok
  11. 1684p. - Mikbac
  12. 1624p. - Anonim 3619784
  13. 1520p. - Marcin Putra
  14. 1480p. - ssynowiec
  15. 1365p. - Dawid128
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!

...