Prikaži potpunu verziju : C++ pomoc oko zadatka !
Ima li ko da pomogne oko jednog trivijalnog zadatka pocetniku ?!
Ako pod "pomognem" podrazumevaš "uradi", onda je odgovor verovatno - ne.
(mislim, ja nemam pojma oko c++, ali oni koji imaju će ti verovatno odgovoriti ovako)
Ako pod "pomognem" podrazumevaš "uradi", onda je odgovor verovatno - ne.
(mislim, ja nemam pojma oko c++, ali oni koji imaju će ti verovatno odgovoriti ovako)
Ne treba da mi se uradi....uradio sam ga sam upravo i provjerio, poklapa se sa tacnim resenjem ! Trebalo mi je malo pojasnjenja, samo toliko trazim :)
Umesto da pitaš ima li ko, mogao si odmah da pređeš na stvar i pitaš šta te zanima u vezi koda kog takođe ubaciš u poruku :)
Evo.. malo mi je nejasno nasledjivanje !!
Šta će biti ispisano na ekranu nakon izvršenja datog koda ?
#include <iostream>
using namespace std;
class A{
public:
A(){ cout<<"K A"<<endl; } ~A(){ cout<<"D A"<<endl;}
};
class B{
public:
B(){ cout<<"K B"<<endl; } ~B(){ cout<<"D B"<<endl;}
};
class C{
private: A a;
public:
C(){ cout<<"K C"<<endl; } ~C(){ cout<<"D C"<<endl; }
};
class D{
private: B b;
public:
D(){ cout<<"K D"<<endl; } ~D(){ cout<<"D D"<<endl; }
};
class E: public C, public D{
private: A a; B b;
public:
E(){ cout<<"K E"<<endl; } ~E(){ cout<<"D E"<<endl; }
};
int main(){
{ E e1; }
cin.get(); return EXIT_SUCCESS;
}
Ako znas engleski ovde ti je prilicno lijepo objasnjeno:
http://www.youtube.com/watch?v=ABRP_5RYhqU
http://www.youtube.com/watch?v=jTS7JTud1qQ&feature=fvwrel
Imas kompajler da probas?
Ukratko:
Kod nasledjivanja prvo se konstruisu roditeljske klase i to redom kojim se nasledjuju. Ako roditeljska klasa ima ("has a") objekat onda se prvo inicira konstruktor za taj pa tek onda konstruktor za nju, pa tek na kraju sam derivat.
Neznam da li ste presli gradivo ali bi bilo pametno staviti kod svake klase kod koje planiras da se nasledjuje da njen destruktor bude virtuelan:
virtual ~Roditelj(){}
zbog pravilnog "dealociranja" objekata kad se kreiraju na "heap"-u.
Evo jos malo slikovito:
class E: public C, public D
klasa E naslednik od C
class C{
private: A a;
klasa C ima objekat A pa se poziva prvo konstruktor za A pa onda konstruktor za C.
class E: public C, public D{
klasa E nasledjuje od D
class D{
private: B b;
klasa D ima ojekat B pa se poziva prvo konstruktor za B pa onda konstruktor za D.
class E: public C, public D{
private: A a; B b;
klasa E ima objekat A (konstruktor A) i objekat B (konstruktor B) pa onda tek konstruktor E.
Valjda nisam nesto preskocio.:kreza:
Ja sam ga znao uraditi sablonski ali sad mi je mnogo jasnije nasledjivanje i pozivanje konstruktora osnovne klase pa tek onda izvedenih klasa ....
A imam jedan zadatak sa virtuelnim funkcijama to me malo buni isto :)
Definisane su klase A, B i C kao:
class A {
private: int x;
public:
int y;
A(){ x=5; y=6; z=7; }
protected: int z;
};
class B : public A {
public:
int z;
B():A() { z=3; y=1; }
};
class C : protected A {
public:
int z;
B():A() { z=4; y=2; }
};
U glavnom programu je dio koda:
A m;
B n;
C p;
A *r;
cout << m.x << endl;
cout << m.y << endl;
cout << m.z << endl;
cout << n.x << endl;
cout << n.y << endl;
cout << n.z << endl;
cout << p.x << endl;
cout << p.y << endl;
cout << p.z << endl;
r=&n;
cout << r->x << endl;
cout << r->y << endl;
cout << r->z << endl;
Neke od linija će ispisati brojne vrijednosti, dok će
neke
izazvati poruku greške. Za svaku od linija koje
počinju sa
cout upišite vrijednost koja će biti prikazana ili
obrazloženje
zbog čega kompajler prijavljuje grešku.
Na koji način se u implementaciji neke funkcije
članice klase C
može vrijednost y osnovne klase A uvećati za 1?
Na koji način se u implementaciji neke funkcije
članice klase C
može vrijednost z osnovne klase A uvećati za 1?
offtopic
Cekaj samo da stignes do template-a, template specijalizacije, parcijalne speciajalizacije, metaprogramming-a ima mozak da ti prsne.:n-cc2: :D
offtopic
Cekaj samo da stignes do template-a, template specijalizacije, parcijalne speciajalizacije, metaprogramming-a ima mozak da ti prsne.:n-cc2: :D
Hahaha, vec mi je mozak na izdisaju...mrzim programske jezike :)
Sta ti ovde nije jasno?
Ovo sam malo skratio jer treba duze da se objasnjava.
cout << m.x << endl;
cout << m.y << endl;
cout << m.z << endl;
cout << n.x << endl;
cout << n.y << endl;
cout << n.z << endl;
cout << p.x << endl;
cout << p.y << endl;
cout << p.z << endl;
Samo pogledas kako su deklarisane promenjljive:
1.
A m;
znaci m je objekat klase A
cout << m.x << endl;
clan x od objekta m je deklarisan:
class A {
private: int x;
kao "private" tako da njemu ne mozes pristupiti van same klase.
2.
clan y od objekta m je deklarisan:
public:
int y;
kao "public" tako da ima "normalan" pristup pa bi ispisalo vrednost.
3.
clan z od objekta m je deklarisan:
protected: int z;
tako da vazi isto pravilo kao i za x (pod 1).
...
za sve ostalo vazi isto.
jel ti ovo greska u kucanju:
class C : protected A {
public:
int z;
B():A() { z=4; y=2; }
};
Hvala ti opet...
A ono nije greska u kucanju vec je takva postavka zadatka, ja sam samo odradio copy paste !
Najvise me bune klase B i C...
Kako naprimer p.y ne moze da prikaze a nije protecded u klasi C a p.z moze jer je public to kontam !
class A
{
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A
{
// x je public
// y je protected
// z nije dostupno sa B
};
class C : protected A
{
// x je protected
// y je protected
// z nije dostupno sa C
};
class D : private A
{
// x je private
// y je private
// z nije dostupno sa D
};
Edit: znaci kad nasledjujes C od A sa protected pristupom menja se i pristup clana 'y' u A.
class A
{
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A
{
// x je public
// y je protected
// z nije dostupno sa B
};
class C : protected A
{
// x je protected
// y je protected
// z nije dostupno sa C
};
class D : private A
{
// x je private
// y je private
// z nije dostupno sa D
};
Edit: znaci kad nasledjujes C od A sa protected pristupom menja se i pristup clana 'y' u A.
Otvorih i tebi glavu sa ovim zadacima :) oprosti...
Imam jos sat vremena do kolokvijuma, javicu ti kako sam prosao... Jasnije mi je puno poslije tvoje pomoci
Hvala ti jos jednom
Opet ja...
Ako ima ko vremena i volje da mi malo detaljnije objasni zadatak... Zanima me svaka linija, svaka komanda, svaki karakter ... Gubim se malo oko referenci i pokazivaca :)
_____________________________________________
Sta ce biti ispisano na ekranu nakon izvrsenja datog kofda ?!
class A
{
private:
int *a;
public:
A(){ a = new int(0); cout<<"konstruktor bez argumenata"<<endl; }
A(int i){ a = new int(i); cout<<"konstruktor"<<endl; }
A(const A&);
~A(){ delete a; a = 0; cout<<"destruktor"<<endl; }
int GetA()const{return *a;}
};
A::A(const A& a1)
{
a = new int(*a1.a);
cout<<"konstruktor kopije"<<endl;
}
int main(){
{
A *a1 = new A(6);
A a2(*a1);
cout<<"a="<<a2.GetA()<<endl;
delete a1;
}
cin.get(); return EXIT_SUCCESS;
}
Како уопште можеш и да компајлираш тај код? Молим те организуј боље то и користи [ code ] [ / code ] тагове кад хоћеш да га покажеш, нпр. овако.
#include <iostream>
#include <cstdlib>
using namespace std;
class A
{
private:
int *a;
public:
A(){ a = new int(0); cout<<"konstruktor bez argumenata"<<endl; }
A(int i){ a = new int(i); cout<<"konstruktor"<<endl; }
A(const A&);
~A(){ delete a; a = 0; cout<<"destruktor"<<endl; }
int GetA()const{return *a;}
};
A::A(const A& a1)
{
a = new int(*a1.a);
cout<<"konstruktor kopije"<<endl;
}
int main()
{
A *a1 = new A(6);
A a2(*a1);
cout<<"a="<<a2.GetA()<<endl;
delete a1;
return EXIT_SUCCESS;
}
Излаз програма је:
[hauzer@harch test]$ ./skrade
konstruktor
konstruktor kopije
a=6
destruktor
destruktor
Шта си очекивао?
Uspjeo sam da ga kompajliram u dev C++, rezultat znam....
Mislio sam ako neko ima strpljenja da objasni sve linije u kodu ...
Belphegor
13.5.2011, 11:20
#include <iostream>
using namespace std;
class A
{
private:
int *a;//int pokazivac
public:
A()
{
//alocira memoriju na heap-u za int gde
//je 'a' pokazivac na taj blok memorije
//i dodeljuje vrednost 0 za taj int
a = new int(0);
cout<<"konstruktor bez argumenata"<<endl;
}
A(int i)
{
//alocira memoriju na heap-u za int gde
//je 'a' pokazivac na taj blok memorije
//i dodeljuje vrednost 'i' za taj int
a = new int(i); cout<<"konstruktor"<<endl;
}
A(const A&);
~A()
{
//dealocira memoriju
delete a;
a = 0;
cout<<"destruktor"<<endl;
}
int GetA()const
{
//vraca vrednost int sa memorijske adrese
//na koju pokazivac 'a' pokazuje
return *a;
}
};
A::A(const A& a1)
{
//alocira memoriju na heap-u za int gde
//je 'a' pokazivac na taj blok memorije
//i kopira vrednost od reference drugog objekta
a = new int(*a1.a);// '.' je starije od '*'
cout<<"konstruktor kopije"<<endl;
}
int main()
{
{
//kreira objekat A tipa koji je pokazivac
//konstruktor sa int parametrom
A *a1 = new A(6);
//kreira objekat A tipa
//konstructor kopije
A a2(*a1);
cout<<"a="<<a2.GetA()<<endl;
delete a1;//dealocira memoriju na koju pokazuje a1
//poziva se destruktor za a1
}//izasli iz skopa, poziva se destruktor za a2
std::cout << "Press enter to exit...";
std::cin.get();
return 0;
}
Mada ovaj kod moze malo da zbuni, uvek preferiram explicitno da stavim u zagrade da se vidi o cemu se radi zbog lakseg citanja, gore je ostavljeno kako jeste posto ti je takav zadatak.
A::A(const A& a1)
{
//a = new int(*a1.a);
a = new int(*(a1.a));
}
Hvala profesore :) Ocajno sam prosao na kolokvijum pa moram na popravni da se vadim ...
referenca je & drugi naziv za isti objekat, npr b = &a; a++; znaci da kad se mijenja a mijenja se i b jer je u pitanju ista memoriska lokacija zar ne ?!
I koja je razlika izmedju reference i pokazivaca ?!
Belphegor
13.5.2011, 11:44
profesor...
Nisam ti ja profesor!:kreza: I ja sam relativno pocetnik, ima dosta stvari jos koje neznam, tako da znas da informacije koje dam mogu da budu i neispravne.
referenca je & drugi naziv za isti objeka
Da.
I koja je razlika izmedju reference i pokazivaca ?!
Kako da objasnim?
Svaka ima svojih mana i dobiti. Evo da ne pisem imas ovde. (http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c)
edit:
npr b = &a; a++; znaci da kad se mijenja a mijenja se i b jer je u pitanju ista memoriska lokacija zar ne ?!
ako ti je b reference ne treba da stavljas '&' operator da joj dodelis 'a'.
To ti je samo za pokazivace:
int* b = &a;//dodeljuje adresu od 'a' na koju ce pokazivac 'b' da manipulise/pokazuje.
Nisam ti ja profesor!:kreza: I ja sam relativno pocetnik, ima dosta stvari jos koje neznam, tako da znas da informacije koje dam mogu da budu i neispravne.
Da.
Kako da objasnim?
Svaka ima svojih mana i dobiti. Evo da ne pisem imas ovde. (http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c)
Za mene si profesor obzirom da mrzim programiranje i da sam totalno neupucen, gledam samo da otarasim taj predmet :)
Pogledacu ovaj link...hvala ti
uspjeo sam da ga kompajliram u dev c++, rezultat znam....
Mislio sam ako neko ima strpljenja da objasni sve linije u kodu ...
Аха. Па ево, имаш професора да ти објасни све. :)
Аха. Па ево, имаш професора да ти објасни све. :)
Sa mojom kolicinom znanja iz C++ svi su za mene profesori :)
vBulletin® v3.8.7, Copyright ©2000-2024, vBulletin Solutions, Inc.