Problem ze śledzeniem destruktrów

0

Cześć,będę miał w przyszłym tyg egzamin z programowania obiektowego gdzie w części praktycznej jest zadanie w którym trzeba zinterpretować kod pod względem tego co wypisze na ekran. Przyklad:

Jaki będzie wynik (wydruk) działania następującego kodu?
static int c = 0;
class B;
class A{
        int n;
        B *bp;
        A *ap;
public:
        A(int nn);
        ~A();
};
class B{
        int n;
        A *ap;
        B *bp;
public:
        B(int nn);
        ~B();
};
A::A(int nn) : n(nn), bp(0), ap(0){
        c++;
        if (n > 0){
                bp = new B(n - 1);
                ap = new A(n - 1);
        }
}
A::~A(){
        if (bp) delete bp;
        cout << 'A';
        if (ap) delete ap;
}
B::B(int nn) : n(nn), bp(0), ap(0){
        c++;
        if (n > 0){
                ap = new A(n - 1);
                bp = new B(n - 1);
        }
}
B::~B(){
        if (bp) delete bp;
        cout << 'B';
        if (ap) delete ap;
}
int main(){
        { A x(3); }
        cout << endl << c << endl;
        return 0;
}

I o ile wiem jaka bedzie wartosc zmiennej statycznej c bo potrafie śledzić kolejnosc wywolan konstruktora to ciag znakow AB ktore reprezentuja wywolanie destruktora wychodzi mi zupelnie inny niz jak wrzucam kod do kompilatora. Wiem ze destruktory sa wywolywane od pochodnej, ale przy tak rekurencyjnym przykladzie nie potrafie sobie z tym poradzic. Ciag wywolan konstruktorow to A(3)->B(2)->A(1)->B(0)->A(0)->B(1)->A(0)->B(0)->A(2)->B(1)->A(0)->B(0)->A(1)->B(0)-A(0) gdzie argument to aktualna wartosc pola int n.

4

Nie chce mi się rozpisywać dla 3, zrobię dla 2. Zarówno ~A() i ~B() najpierw niszczą obiekt B, a potem A.

A(2)
    A(1)
        A(0)
        B(0)
    B(1)
        A(0)
        B(0)

Dla każdego obiektu A wywoływane jest c++, czyli 4x

Przy destrukcji, wywoływane jest delete b, cout X, delete a, czyli:

~A(2)
    ~B(1)
        ~B(0)
            cout << B
        cout << B
        ~A(0)
            cout << A
    cout << A
    ~A(1)
        ~B(0)
            cout << B
        cout << A
        ~A(0)
            cout << A

dla każdego ~B() wywoływane jest c++, czyli 3x. Ostatecznie więc c == 7

wypisze BBAABAA

https://wandbox.org/permlink/NJyvMsoLAjF6jZRr

Prowadzącemu należy się karne prącie za takie durne zadania, a także za kod niespełniający jakichkolwiek standardów (rule of 3/5/0, new, delete).

0

Wow,dzięki ze tak to rozrysowales bo chyba tylko dzięki temu to zrozumiałem :) Daje łapkę w gore

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