Uzupełnianie Klasy(konstruktory , destruktory)

0

Witam
W jednym zadań na ćwiczeniach miałem za zadanie uzupełnić brakujący kod tak aby klasa działała poprawnie,uczę się , i nie jestem pewien czy o wszystkim pamiętałem dlatego proszę was o spojrzenie na kod . Będe bardzo wdzięczny jeśli ktoś mi zwróci na jakiś element uwagę:

Pozdrawiam i z góry dziękuje za uwagi:

     // Prawie dobra klasa

#include <iostream>
using namespace std;

class A
{
    int* tab;
    static int c;
    int n;
public:
    A(int);         // konstruktor
    A(const A&);    // konstruktor kopiujacy
    ~A();           // destruktor
    void getA();    // metoda
};

int A::c = 0;

    // Uzupelnic konstruktor!
A::A(int x):n(++c)
{
    cout << "Poczatek konstruktora (" << n << ")" << endl;
    
    tab=new int[2];
    tab[0] =x;
    tab[1]=x;
     
    // tworzenie na stercie tablicy (tab) 2 elementow oraz 
    // wypelnienie jej wartosciami x
    // ......
    
    cout << tab[0] << ", " << tab[1] << endl;
    cout << "Koniec konstruktora (" << n << ")" << endl;
}    

    // Uzupelnic konstruktor kopiujacy!
A::A(const A& aa):n(++c)
{
    cout << "Poczatek konstruktora kopiujacego (" << n << ")" << endl;
    tab=new int[2];
    tab[0] = aa.tab[0];
    tab[1] = aa.tab[1];
    // wlasciwe kopiowanie (pola bedacego tablica 2 elementow typu int)
    // ......
    
    cout << tab[0] << ", " << tab[1] << endl;
    cout << "Koniec konstruktora kopiujacego (" << n << ")" << endl;
}

    // Uzupelnic desktruktor!
A::~A()
{
    cout << "\nPoczatek destruktora (" << n << ")" << endl;
    cout << tab[0] << ", " << tab[1] << endl;
    
    // kod zwalniajacy pamiec tab
    // ......
    delete []tab;
    
    cout << "Koniec destruktora (" << n << ")\n" << endl;
}

void A::getA()
{
    cout << "Wynik (" << n << "): " << tab[0] << ", " << tab[1] << "\n" << endl;
}

int main()
{
  
    A a1(10);        // Poczatek konstruktora (1)
                     // 10, 10
                     // Koniec konstruktora (1)
    a1.getA();       // Wynik (1): 10, 10
   
   
    A a2 = A(20);    // Poczatek konstruktora (2)
                     // 20, 20
                     // Koniec konstruktora (2)
    a2.getA();       // Wynik (2): 20, 20
   
       
    A a3 = A(a2);    // Poczatek konstruktora kopiujacego (3)
                     // 20, 20
                     // Koniec konstruktora kopiujacego (3)
    a3.getA();       // Wynik (3): 20, 20
   
         
    A* a4 = new A(a1);    // Poczatek konstruktora kopiujacego (4)
                          // 10, 10
                          // Koniec konstruktora kopiujacego (4)
    a4->getA();           // Wynik (4): 10, 10

   
    delete a4;   // Poczatek destruktora (4)
                 // 10, 10
                 // Koniec destruktora (4)
   
    system("pause");  // tylko MS Windows

                  // po zakonczeniu funkcji main                  

                  // Poczatek destruktora (3)
                  // 20, 20
                  // Koniec destruktora (3)

                  // Poczatek destruktora (2)
                  // 20, 20
                  // Koniec destruktora (2)

                  // Poczatek destruktora (1)
                  // 10, 10
                  // Koniec destruktora (1)       
   return 0;
}
delete a1;
0

Z definicji konstructor kopiujacy powinen kopiowac wszystko co znajduje sie w kopiowanym obiecie, tak wiec

A::A(const A& aa):n(++c)
{
cout << "Poczatek konstruktora kopiujacego (" << n << ")" << endl;
tab=new int[2];
tab[0] = aa.tab[0];
tab[1] = aa.tab[1];
// wlasciwe kopiowanie (pola bedacego tablica 2 elementow typu int)
// ......

cout << tab[0] << ", " << tab[1] << endl;
cout << "Koniec konstruktora kopiujacego (" << n << ")" << endl;

}

Zbytnio nie ma sensu. Powinno byc raczej

A::A(const A& aa) : tab(new int[2]), n(aa.n)
{
cout << "Poczatek konstruktora kopiujacego (" << n << ")" << endl;
tab[0] = aa.tab[0];
tab[1] = aa.tab[1];
// wlasciwe kopiowanie (pola bedacego tablica 2 elementow typu int)
// ......

cout << tab[0] << ", " << tab[1] << endl;
cout << "Koniec konstruktora kopiujacego (" << n << ")" << endl;

}

pytanie tylko w jakim celu zdefiniowano tutaj c. Wydaje my sie, ze jest to zrobione by wykryc wyciek pamieci, tak wiec destruktor powinien dekrementowac c aby na koncu twojego programu mozna bylo sprawdzic wielkosc c, ktora powinna zejsc do 0. Pozdrawiam serdecznie

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