Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zadatak - rezultat ispisa

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zadatak - rezultat ispisa

[ Pregleda: 3281 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.147.*



Profil

icon Zadatak - rezultat ispisa24.08.2010. u 11:37 - pre 134 meseci
Pozdrav

Malo vjezbam ovaj C++ i naisao sam na zadatke ovog tipa i nikako da to skontam. Onako lupam bezveze, pa sta pogodim. Zato molim nekog da mi malo poblize objasni. Radi se o sljedecem. Imam dat kod ispod i trebam napisati sta ce program dati kao rezultat ispisa:

Code:
#include <iostream>

using namespace std;
class super
{
    public:
    virtual ~super()
    {
        cout << "Pozdrav od bazne" << endl
    }
    void f(int i)
    {
        cout << "Super : " << i << endl;
    }
};

class sub : public super
{
    public:
    ~sub()
    {cout << "pozdrav od izvedene;" << endl;
    }
    void f(int i)
    {
        cout << "Sub :" << i << endl;
    }
};

int main ()
{
    super b;
    sub i;
    b.f(5);
    i.f(5);
    super& a=i;
    a.f(10);
    super* p = new sub;
    p->f(10);
    delete p;
    return 0;
}


Imam i rješenje zadatka:

Code:
Super : 5
Sub : 5
Super : 10
Super : 10
Pozdrav od izvedene;
Pozdrav od bazne
Pozdrav od izvedene;
Pozdrav od bazne
Pozdrav od bazne


Eh sad mi tu nije jasno odakle ovoliko pozivanja destruktora :D I kako ce se ponasati varijabla i ako je definisemo u ovom redu: super& a=i, a kako ova nova sub iz ovog reda: super* p = new sub. Je li ona sub, ili super, jer pokazivac je na tip super :S Zadnja dva reda u ispisu se pojave nakon zavrsetka programa. Koje se to dvije bazne tad uniste :S Eto, nadam se da ce mi neko pomoci. Hvala unaprijed
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Zadatak - rezultat ispisa24.08.2010. u 11:59 - pre 134 meseci
Imaš tri objekta, pa samim tim se izvršavaju tri destruktora osnovne klase. Dva od ta tri objekta su objekti izvedene klase sa virtuelnim destruktorom, i zato imaš i dva destruktora izvedene klase.

Pointer p je pointer na tip super i može da pokazuje na sve što je tipa super. Stvar je u tome što je i sub je tipa super. Ono što je u primeru problem je to što funkcija super::f nije virtuelna. Pošto nije virtuelna onda kompajler ne zna kako da pozove sub::f kad se pozove p->f(10). Stavi da je super::f virtuelna pa probaj ponovo.

Po redosledu se uništava prvo ono što je poslednje napravljeno. Prvo se uništava sub i (i to su treći i drugi red otpozadi), a zatim se uništava i super b. a nije objekat nego referenca, tu nema šta da se uništava.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.198.*



Profil

icon Re: Zadatak - rezultat ispisa24.08.2010. u 19:03 - pre 134 meseci
E hvala, neke stvari sam razumio, a da budem siguran mozes li mi molim te ovako napisati: pored svake linije ispisa napisati koja linija koda je tu liniju "izazvala", npr ovako:

Super : 5 // b.f(5)
Sub : 5 // i.f(5)
Super : 10
Super : 10
Pozdrav od izvedene;
Pozdrav od bazne
Pozdrav od izvedene;
Pozdrav od bazne
Pozdrav od bazne
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Zadatak - rezultat ispisa24.08.2010. u 20:30 - pre 134 meseci
Bolje bi bilo da si ti napisao kako misliš da treba, a da mi samo ispravimo ako ima šta da se ispravlja. Sad ja moram da radim tu neki Copy-Paste, :gunđ:

Super : 5 // b.f(5)
Sub : 5 // i.f(5)
Super : 10 // a.f(10);
Super : 10 // p->f(10);
Pozdrav od izvedene; // p->~sub() <- ovo znači da se izvršava destruktor klase sub nad objektom na koji pokazuje p
Pozdrav od bazne // p->~super()
Pozdrav od izvedene; // i.~sub()
Pozdrav od bazne // i.~super()
Pozdrav od bazne // b.~super()
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.196.*



Profil

icon Re: Zadatak - rezultat ispisa24.08.2010. u 21:20 - pre 134 meseci
Hvala puno! Mislim da mi je sad jasnije.

A dok smo tu, ako moze jos jedno pitanje. Pravim klasu Razlomak, i recimo kod pravljenja operatora << za ispis, zasto mora funkcija obavezno biti friend? U public dijelu je navedem:

Code:
friend ostream& operator << (ostream& izlaz, const Razlomak& a);


i onda dole negdje izvan klase odradim ovo:

Code:
ostream& operator << (ostream& izlaz, const Razlomak& a)
    {
        izlaz << a.broilac;
        izlaz << "/";
        izlaz << a.imenioc;
        return izlaz;
    }


i sve radi super. Međutim ako u Public od klase razlomak navedem funkciju na nacin:

Code:
ostream& operator << (ostream& izlaz, const Razlomak& a);


i onda van klase napisem funkciju na sljedeci nacin:

Code:
ostream& Razlomak::operator << (ostream& izlaz, const Razlomak& a)
    {
        izlaz << a.broilac;
        izlaz << "/";
        izlaz << a.imenioc;
        return izlaz;
    }


tada ne radi. Zasto, zar i u drugom slucaju operator << nije clan klase Razlomak, i samim tim moze pristupati njegovim privatnim clanovima?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Zadatak - rezultat ispisa24.08.2010. u 22:15 - pre 134 meseci
Možda i radi, pričam napamet, ali jesi li probao da u drugom slučaju iskoristiš operator ne kao što je normalno (cout << razlomak) nego kako si definisao (razlomak.operator<<(cout, razlomak))? Ako želiš da koristiš operator na prirodan način onda moraš da koristiš notaciju sa friend.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.234.*



Profil

icon Re: Zadatak - rezultat ispisa25.08.2010. u 23:47 - pre 134 meseci
Ipak jos neke stvari oko ispisa imaju mi totalno nejasne... U primjeru iznad, zasto se uvijek poslije pozivanja destruktora izvedene klase poziva i destruktor super klase?

A drugo pitanjee je drugi primjer koji ide ovako:

Code:
#include <iostream>
#include <string>

using namespace std;

class Test

{
    public:
    Test()
    {
        cout << "Konstruisem objekat 1" << endl;
    }
    Test(const Test& drugi)
    {
        cout << "Konstruisem objekat 2" << endl;
    }
    
    ~Test()
    {
        cout << "Objekat nestaje" << endl;
        }
};
void fun1(Test test)
{
    cout << "U funkciji 1\n";
}
Test& fun2(Test& test)
{
    cout << "U funkciji 2\n";
    return test;
}

Test fun3(Test& test)
{
    cout << "U funkciji 3\n";
    return test;
}

Test o1;
int main()

{
    cout << "Program pocinje\n";
    fun1(o1);
    fun2(o1);
    Test o2=fun3(o1);
    cout << "Pozdrav\n";
    system("pause");
    return 0;
}


i daje sljedeci rezultat na ispisu:

Citat:
Konstruisem objekat 1
Program pocinje
Kontstruisem objekat 2
U funkciji 1
Objekat nestaje
U funkciji 2
U funkciji 3
Konstruisem objekat 2
Pozdrav
Objekat nestaje
Objekat nestaje


I tu mi je sve apsolutno jasno, osim dvije linije koje se, po meni, pojave usred programa nicim izazvane :S
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Zadatak - rezultat ispisa26.08.2010. u 09:46 - pre 134 meseci
Funkcija fun1 kao parametar ima objekat, a ne referencu na objekat kao ostale funkcije (nedostaje &). To znači da objekat mora da se iskopira pre poziva funkcije. Tokom kopiranja dolazi i do stvaranja objekta, koji se uništava na kraju funkcije.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Zadatak - rezultat ispisa26.08.2010. u 09:48 - pre 134 meseci
Destruktor izvedene klase se poziva jer je to po standardu. Zamisli da u izvedenoj klasi imaš neku članicu koju moraš ručno da obrišeš. Kako bi to izveo bez destruktora izvedene klase?
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.203.*



Profil

icon Re: Zadatak - rezultat ispisa26.08.2010. u 15:07 - pre 134 meseci
Ovo prvo sam shvatio sa fun(o1);

Medjutim ovo sa destruktorom mi bas nije najjasnije... Recimo ovdje:

Pozdrav od izvedene; // p->~sub()
Pozdrav od bazne // p->~super()
Pozdrav od izvedene; // i.~sub()
Pozdrav od bazne // i.~super()
Pozdrav od bazne // b.~super()

zasto se uvijek poslije destruktora sub klase poziva i destruktor super klase? Je li to neko pravilo ili samo zbog neceg u prvom primjeru u temi koji sam postavio?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Zadatak - rezultat ispisa26.08.2010. u 15:23 - pre 134 meseci
Svaki sub je istovremeno i super. Svaki objekat tipa sub ima u sebi i sve ono što ga čini i superom. Kad brišeš takav objekat onda moraš celog da ga obrišeš, to jest moraš da obrišeš sve ono što se tiče suba a zatim i sve ono što se tiče supera. Ne možeš da ga obrišeš na pola, a pola da ostaviš. To je sve deo standarda, i uči se u školi.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.203.*



Profil

icon Re: Zadatak - rezultat ispisa26.08.2010. u 16:22 - pre 134 meseci
To sam i pretpostavio, ali naisao sam na ovaj zadatak:

Code:
#include <iostream>
using namespace std;
class B

{
    public:
    virtual ~B() {cout << "pozdrav" << endl;}
    virtual void fa()
    {cout << "b fa()" << endl;}
    void fb() {cout << "B fb()" << endl;}
};

class I : public B
{
    public:
    void fa() {cout << "I fa()" << endl;}
    void fb() {cout << "I fb()" << endl;}
};

int main()
{
    I b;
    B f = b;
    B& fr = b;
    B* fp = &b;
    f.fa();
    f.fb();
    fr.fa();
    fr.fb();
    fp->fa();
    fp->fb();
    return 0;
}


koji daje sljedeci ispis:

Code:
B fa<>
B fb<>
I fa<>
B fb<>
I fa<>
B fb<>
Pozdrav
Pozdrav


I sve je ok, mogu ga pratiti, ali "po mom" na kraju trebaju biti tri Pozdrava. Jer su tri objekta formirana kako ja mogu upratiti. Eto jos to da razjasnim, i necu vise dosadjivati : )
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: Zadatak - rezultat ispisa26.08.2010. u 16:37 - pre 134 meseci
Nije tri nego dva, b tipa I, i f tipa B. Preostale dve promenljive (fr i fp) nisu objekti nego samo pokazuju na druge objekte.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.203.*



Profil

icon Re: Zadatak - rezultat ispisa26.08.2010. u 17:00 - pre 134 meseci
OK, shvatio, razumio. hvala puno!
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zadatak - rezultat ispisa

[ Pregleda: 3281 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.