C++ - brza pitanja iz objektno orij. programiranja zaključana tema

poruka: 175
|
čitano: 45.045
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
Smisao

Pozdravi iz prevruće Dalmacije :P

 

 

 

Počeo sam se baviti c++ prije par mjeseci i sve je išlo "kao po loju" ,sve dok nisam naletio na klase.

Klase općenito razumijem ali nikako da skužim smisao  protectiona nekih funkcija i varijabli.

Ako neko može to malo pojasnit bio bih zahvalan Osmijeh

 

Poruka je uređivana zadnji put pet 17.9.2010 18:56 (Pijavica).
Moj PC  
0 0 hvala 0
17 godina
protjeran
offline
RE: Smisao

Postoje slučajevi gdje varijablama klase ne smiješ pristupati direktno izvana već preko set & get funkcija. Tada se te varijable deklariraju kao privatne, a get i set funkcije kao javne. Razlog je u tome što promjena jedne varijable klase može uzrokovati problem u ostatku klase, a ako se koriste get tj. set funkcije onda će takva set funkcija promjeniti varijablu i napraviti sve ostale potrebne operacije da ne dođe do greške. Nadam se da si skužio.

 

Isto tako, ako je riječ o nasljeđivanju.. neke varijable su specifične samo za neku klasu. Npr. int IDKlase. I takva varijabla mora biti zaštićena tako da derivacija klase ne bi prekopirala taj član i gledala ga kao ID njegove klase (jer je to IDKlase roditelja).

15 godina
neaktivan
offline
Smisao

Npr ako se radi u timu i tvoj zadatak je da napravis klasu datum. Ako ne zastitis pojedine atribute neko drugi bi ko ce samo iskoristiti tu klasu mogao direktno pristupati atributima i recimo za godinu postaviti negativnu vrijednost ili nesto slicno. A kada napravis get i set funkcije ti potpuno upravljas kontrolom pristupu atributima i postaras se da samo regularne vrijednosti mogu 'uci' u klasu

 

Primjer je banalan ali uglavnom to je ta fora..

 

 
2 0 hvala 0
14 godina
neaktivan
offline
Smisao

Kako još neznam ni što je get ni što je set funkcija nisam baš u potpunosti shvatio :/,

no kužim da promjena može uzrokovoat probleme u ostatku klase.

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Smisao

Ahaaa...Mislim da sam shvatio :D.Hvala puno

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
RE: Smisao

nemoj me ismijat ako sad kažem glupost  xD. ....jesi li mislio  da je to kao da deklariram recimo varijablu kao "int n" to služi kako bi spriječilp da u nju upišem npr. 0.43355

15 godina
neaktivan
offline
RE: Smisao

get - funkcija kojom dobavljas atribute klase

set - funkcija kojom postavljas atribute

 

mozes ih kreirati posebno za svaki atribut a mozes i jos jednu kojom bi dohvatio/postavio sve atribute..

 

ova promjena sto sam naveo nece napraviti nikakav problem u samoj toj klasi, tu se cuva ta vrijednost i zavrsena prica ali kada neko koristi tu klasu one ne mora voditi racuna da li su tu ispravni podaci..pretpostavlja da jesu..vraticu se opet na onaj primjer sa datumom..on nece u glavnom dijelu programa testirati varijable prije proslijedjivanja u klasu jer je to uradjeno prilikom kreiranja set() funkcija. On ce samo koristiti set() funkciju koja ce baciti izuzetak ili na neki drugi nacin upozoriti da se pokusava postaviti neka varijabla na besmislenu vrijednost, recimo negativnu za godine ili datum ;)

17 godina
protjeran
offline
Smisao

Evo npr.:

 

#include <iostream>
using namespace std;

class Osoba{
    public:
       int godinaRodjenja, starost;
};

int main(){
    Osoba Ante;
    Ante.godinaRodjenja = 1990; // direktan pristup

    cout << "Antina starost: " << Ante.starost;  // pogrešan rezulat
    cin.get();
    return 0;
}

 

U ovom slučaju direktno se mijenjala godinaRodjenja i zato je podatak o starosti pogrešan. Zato da bi se izbjegle takve greške ograničiš pristup tom članu:

 

#include <iostream>
using namespace std;

class Osoba{
    private:
       int godinaRodjenja;
    public:
       int starost;
       void SetGodinaRodjenja(int n){
          godinaRodjenja = n; // postavi traženu varijablu
          starost = 2010 - godinaRodjenja; // postavi ostale varijable
       }
};

int main(){
    Osoba Ante;

    Ante.SetGodinaRodjenja(1990);

    cout << "Antina starost: " << Ante.starost;  // dobar rezulat
    cin.get();
    return 0;
}

 

i sada kad se želi mijenjati godina rođenja tada se pozove set funkcija koja će obaviti i ostale potrebne operacije (izračun starosti) da u programu ne bi bilo grešaka.

 

Moj PC  
2 0 hvala 0
15 godina
neaktivan
offline
Smisao

to za int ce se pobrinuti kompajler i na vrijeme te upozoriti..ovo sa set() funkcijom govorimo o pravilima koja se postave pri i izradi programa i koja kompajler ne kuzi ;)

 

smisao je da koristenjem set() funkcije besmisleni podaci za neki konkretan slucaj ne 'prodju' bilo nesvjesno bilo namjerno  ;)

 
0 0 hvala 0
15 godina
neaktivan
offline
RE: Smisao
Tracer kaže...

Evo npr.:

 

#include <iostream>
using namespace std;

class Osoba{
    public:
       int godinaRodjenja, starost;
};

int main(){
    Osoba Ante;
    Ante.godinaRodjenja = 1990; // direktan pristup

    cout << "Antina starost: " << Ante.starost;  // pogrešan rezulat
    cin.get();
    return 0;
}

 

U ovom slučaju direktno se mijenjala godinaRodjenja i zato je podatak o starosti pogrešan. Zato da bi se izbjegle takve greške ograničiš pristup tom članu:

 

#include <iostream>
using namespace std;

class Osoba{
    private:
       int godinaRodjenja;
    public:
       int starost;
       void SetGodinaRodjenja(int n){
          godinaRodjenja = n; // postavi traženu varijablu
          starost = 2010 - godinaRodjenja; // postavi ostale varijable
       }
};

int main(){
    Osoba Ante;

    Ante.SetGodinaRodjenja(1990);

    cout << "Antina starost: " << Ante.starost;  // dobar rezulat
    cin.get();
    return 0;
}

 

i sada kad se želi mijenjati godina rođenja tada se pozove set funkcija koja će obaviti i ostale potrebne operacije (izračun starosti) da u programu ne bi bilo grešaka.

 

 

upravo tako ;) 

 

npr u set() funkciju dodas  if(n<0) throw 1; i sprijecio si da neko upise negativnu godinu rodjenja.. 

 

 

Samo da dodam da smo ovdje govorili o public i private atributima..postoji jos i protected koji se koristi kod nasljedjivanja klasa 

Poruka je uređivana zadnji put pon 23.8.2010 1:59 (r00t).
17 godina
moderator
offline
RE: Smisao
Tracer kaže...

U ovom slučaju direktno se mijenjala godinaRodjenja i zato je podatak o starosti pogrešan. Zato da bi se izbjegle takve greške ograničiš pristup tom članu:

 

#include <iostream>
using namespace std;

class Osoba{
    private:
       int godinaRodjenja;
    public:
       int starost;
       void SetGodinaRodjenja(int n){
          godinaRodjenja = n; // postavi traženu varijablu
          starost = 2010 - godinaRodjenja; // postavi ostale varijable
       }
};

int main(){
    Osoba Ante;

    Ante.SetGodinaRodjenja(1990);

    cout << "Antina starost: " << Ante.starost;  // dobar rezulat
    cin.get();
    return 0;
}

 

i sada kad se želi mijenjati godina rođenja tada se pozove set funkcija koja će obaviti i ostale potrebne operacije (izračun starosti) da u programu ne bi bilo grešaka.

Ovo mozda i nije najsretniji primjer, jer s jedne strane ne mozes do vrijednosti varijable godinaRodjenja, dok je varijabla starost nezasticena, a "ovisna" (!), odnosno moze joj se promijeniti vrijednost, a vrijednost joj se zapravo izracunava na temelju druge varijable. Clanove koje treba zastititi bi u pravilu trebalo raditi kombinacijom getter+setter, uz neke iznimke, naravno - koje nisu prisutne u ovom slucaju. Takodjer, varijabla starost je tu zapravo nepotrebna. Znam da je sve to tu "primjera radi", ali treba napomenuti da doticni primjer nije dobra programerska praksa.

 

Dakle, ta klasa bi trebala izgledati otprilike ovako (+ u nju bi trebalo ugurati provjere koje spominje r00t):

class Osoba{
    private:
       int godinaRodjenja;     
    public:      
       void SetGodinaRodjenja(int n){
          godinaRodjenja = n; // postavi traženu varijablu         
       }

      int GetGodinaRodjenja(){
          return godinaRodjenja; // vrati vrijednost privatne varijable godinaRodjenja
       }

      void SetStarost(int starost){
          godinaRodjenja = 2010 - starost;
       }
     
      int GetStarost() {
        return 2010 - godinaRodjenja;
      }
};

 

Tu je u biti simuliran nepostojeci clan starost - moderniji programski jezici koji imaju svojstva tome pristupaju elegantnije (svojstva iliti properties).

 

 

r00t kaže...

Samo da dodam da smo ovdje govorili o public i private atributima..postoji jos i protected koji se koristi kod nasljedjivanja klasa 

Tako je. Atribut vrste protected bi se mogao opisati kao skriveni/privatni javni clan. Odnosno, nasljedjuje se poput javnog (public) clana, ali kad mu se pokusa pristupiti izvan klase, onda se ponasa kao privatni (private) clan.

 

17 godina
protjeran
offline
RE: Smisao

Nisam pokušavao govoriti o programerskoj praksi već složiti najbanalniji primjer moguće greške pri direktnom pristupu (mijenjanju) člana klase ako je programer neiskusan i dopušta onakve direktne među-ovisnosti. Jasno. U pravilu stvari trebaju biti postavljene sasvim drukčije. Svaki član (koji se smatra kao propertie) treba imati svoje set i get metode, a možda i najbolji primjer su COM komponente. Ako si ih radio u Delphiju znaš da i sam IDE za svaki propertie generira te metode jer je to praksa i preusmjerava čitanje i pisanje članova klase kroz te metode.

 

I da. Protected je tek proširenje private pristupa. Derivacije klase mogu takvom članu pristupiti no za sve ostale je i dalje nedostupan.

Poruka je uređivana zadnji put pon 23.8.2010 3:42 (Tracer).
17 godina
moderator
offline
RE: Smisao
Tracer kaže...

Nisam pokušavao govoriti o programerskoj praksi već složiti najbanalniji primjer moguće greške pri direktnom pristupu (mijenjanju) člana klase ako je programer neiskusan i dopušta onakve direktne među-ovisnosti. Jasno.

Bez uvrede, znam da si covjeku pokusao pomoci (i cijenim to sto pomazes ljudima na forumu), ali primjer koji bi trebao pokazati kako ispravno napraviti jednu stvar, a istovremeno tu istu stvar pogresno prikazuje na drugom clanu (i uvodi jos jedan pogresan koncept, te nigdje nije objasnjeno da to i dalje nije ispravan primjer) je - los primjer. Nekoga tko nije upoznat s problematikom lako moze dovesti u zabludu ili ga zbuniti.

 

Zasto pisati takav primjer, ako se s par linija koda vise (ili manje! za ilustraciju primjera nisu potrebne dvije varijable u klasi) moze napisati ispravan primjer?  Namigiva Retoricko pitanje, naravno.

17 godina
protjeran
offline
RE: Smisao
mbaksa kaže...
Tracer kaže...

Nisam pokušavao govoriti o programerskoj praksi već složiti najbanalniji primjer moguće greške pri direktnom pristupu (mijenjanju) člana klase ako je programer neiskusan i dopušta onakve direktne među-ovisnosti. Jasno.

Bez uvrede, znam da si covjeku pokusao pomoci (i cijenim to sto pomazes ljudima na forumu), ali primjer koji bi trebao pokazati kako ispravno napraviti jednu stvar, a istovremeno tu istu stvar pogresno prikazuje na drugom clanu (i uvodi jos jedan pogresan koncept, te nigdje nije objasnjeno da to i dalje nije ispravan primjer) je - los primjer. Nekoga tko nije upoznat s problematikom lako moze dovesti u zabludu ili ga zbuniti.

 

Zasto pisati takav primjer, ako se s par linija koda vise (ili manje! za ilustraciju primjera nisu potrebne dvije varijable u klasi) moze napisati ispravan primjer? Namigiva Retoricko pitanje, naravno.

Ok. Nisam stavio starost u get i što sad? Linč? A da je primjer baš tako loš - nije. Čovjek je shvatio ono što je htio znati i gotovo.

 

17 godina
moderator
offline
RE: Smisao
Tracer kaže...

Ok. Nisam stavio starost u get i što sad? Linč? A da je primjer baš tako loš - nije. Čovjek je shvatio ono što je htio znati i gotovo.

Sorry, ali zaista ne bih znao kako stupnjevati to koliko je primjer los. Mogu samo reci da primjer nije dobar. I objasnio sam zasto. Primjerom pokusavas pokazati kako i zasto zastititi clanove. Medjutim, nisi dosljedan (jednu varijablu si zastitio, drugu nisi i nisi objasnio zasto nisi - dakle, nedosljedan si oko "zasto?") i uvodis pogresan koncept (jednim setterom postavljas vrijednosti dva clana, od kojih je nezasticeni clan ovisan o zasticenom, sakrijes read-vrijednost zasticenog clana i otkrijes nezasticeni! - totalno pogresno - primjerom dakle nisi pokazao "kako?"). Uopce je suvisno da to dalje komentiramo. Napisao sam kako izgleda ispravan primjer i to je to. Prica zavrsena.

 

Naravno, ispravan primjer se moze napraviti i na druge nacine - ovisno sto tocno se zeli napraviti. Ali tvoj primjer nije ispravan. I sto god da ti sad napises, nece postati ispravan. Ako se ne slazes s mojim rjesenjem, slobodan si napisati svoje drugo, ispravno rjesenje. Nemam nista protiv - dapace - time nitko nista ne gubi, mozemo samo eventualno nesto novo nauciti.

17 godina
protjeran
offline
RE: Smisao
mbaksa kaže...
Tracer kaže...

Ok. Nisam stavio starost u get i što sad? Linč? A da je primjer baš tako loš - nije. Čovjek je shvatio ono što je htio znati i gotovo.

Sorry, ali zaista ne bih znao kako stupnjevati to koliko je primjer los. Mogu samo reci da primjer nije dobar. I objasnio sam zasto. Primjerom pokusavas pokazati kako i zasto zastititi clanove. Medjutim, nisi dosljedan (jednu varijablu si zastitio, drugu nisi i nisi objasnio zasto nisi - dakle, nedosljedan si oko "zasto?") i uvodis pogresan koncept (jednim setterom postavljas vrijednosti dva clana, od kojih je nezasticeni clan ovisan o zasticenom, sakrijes read-vrijednost zasticenog clana i otkrijes nezasticeni! - totalno pogresno - primjerom dakle nisi pokazao "kako?"). Uopce je suvisno da to dalje komentiramo. Napisao sam kako izgleda ispravan primjer i to je to. Prica zavrsena.

 

Naravno, ispravan primjer se moze napraviti i na druge nacine - ovisno sto tocno se zeli napraviti. Ali tvoj primjer nije ispravan. I sto god da ti sad napises, nece postati ispravan. Ako se ne slazes s mojim rjesenjem, slobodan si napisati svoje drugo, ispravno rjesenje. Nemam nista protiv - dapace - time nitko nista ne gubi, mozemo samo eventualno nesto novo nauciti.

Kako misliš "zašto?"? Možda zato što je bilo 2 ujutro kad sam pisao taj post pa mi i nije bilo do toga da pazim na dlaku na jajetu? Uostalom, već sam rekao da meni nije bio cilj objasniti get i set već nešto drugo, a ti sad od jedne gulposti tu radiš slona jer taj get ionako je bio nebitan za funkcionalnost tog primjera već je riječ o nekim principjelnim stvarima o kojima sam ti gore već rekao da se slažem s tobom. Stoga, ne razumijem što ti više hoćeš? Smijeh

 

EDIT: Ovo me podsjeća na lokalnu ekipu na formu koja slučajno primjeti nečiju grešku u ije-je i onda postanu književnici i filozofi kad treba nekoga ispravljati. Onak, fakat strašno Smijeh

Poruka je uređivana zadnji put pon 23.8.2010 8:37 (Tracer).
17 godina
offline
RE: Smisao
mbaksa kaže...
Bla bla bla jodl jodl jodl...

Cjepidlacis :)

I'm going woo woo
17 godina
moderator
offline
Smisao zaštite varijabli i funkcija unutar klasa?

int main(){
    Osoba Ante;
    Ante.SetGodinaRodjenja(1990);

   Ante.starost = 389;

    cout << "Antina starost: " << Ante.starost;  // dobar rezulat (zaista?)
    cin.get();
    return 0;
}

Toliko o cjepidlacenju i o tome sto ja zapravo hocu. Belji se

 
1 0 hvala 0
15 godina
neaktivan
offline
Smisao zaštite varijabli i funkcija unutar klasa?

@mbuksa

 

U potpuosti se slazem sa tebon da je bez obzira na primjer varijablu startost trebalo deklarirat kao privatnu a ne kao javnu bez obzira sto je to test primjer ali onoliko ic u detalje i pisat sve ono nema smisla a povrh svega zbunjuje covjeka oko onoga sto zeli naucit.

 

Koliko sam shvatio autor posta jos uci i samu sintaksu jezika pa zar onda ima uopce smisla opterecivat ga dobrom programerskom praksom?

 

 

 
0 0 hvala 0
17 godina
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
mbaksa kaže...

int main(){
    Osoba Ante;
    Ante.SetGodinaRodjenja(1990);

   Ante.starost = 389;

    cout << "Antina starost: " << Ante.starost;  // dobar rezulat (zaista?)
    cin.get();
    return 0;
}

Toliko o cjepidlacenju i o tome sto ja zapravo hocu. Belji se

Momku klase same po sebi nisu sjele, nezna razliku izmedju private / public / protected i onda ga jos zbunjivat sa ovim? Pomalo... put od tisucu milja pocinje prvim korakom.

I'm going woo woo
17 godina
moderator
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
Jeronim kaže...
U potpuosti se slazem sa tebon da je bez obzira na primjer varijablu startost trebalo deklarirat kao privatnu a ne kao javnu bez obzira sto je to test primjer ali onoliko ic u detalje i pisat sve ono nema smisla a povrh svega zbunjuje covjeka oko onoga sto zeli naucit.

Detalji su za one koji znaju. Da znaju zbog cega je onaj Tracerov primjer los.

 

Jeronim kaže...
Koliko sam shvatio autor posta jos uci i samu sintaksu jezika pa zar onda ima uopce smisla opterecivat ga dobrom programerskom praksom?

Ispravan primjer je za onog koji zeli nauciti. Zasto da se covjeka uci na losim primjerima? Primjer poput Tracerovog neces naci ni u jednoj knjizi za ucenje C++-a (pa ni onoj namijenjenoj pocetnicima), osim eventualno kao primjer za los/pogresan nacin skrivanja clanova.

 

tnakir kaže...
mbaksa kaže...

int main(){
    Osoba Ante;
    Ante.SetGodinaRodjenja(1990);

   Ante.starost = 389;

    cout << "Antina starost: " << Ante.starost;  // dobar rezulat (zaista?)
    cin.get();
    return 0;
}

Toliko o cjepidlacenju i o tome sto ja zapravo hocu. Belji se

Momku klase same po sebi nisu sjele, nezna razliku izmedju private / public / protected i onda ga jos zbunjivat sa ovim? Pomalo... put od tisucu milja pocinje prvim korakom.

Zbunjivat s cim konkretno? Iz tog primjer se jasno vidi da je Tracerov primjer pogresan. Tu i svaki pocetnik vidi da ne smije biti moguce promijeniti varijablu starost izvan klase. O cemu onda ti pricas?

17 godina
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
mbaksa kaže...
Jeronim kaže...
U potpuosti se slazem sa tebon da je bez obzira na primjer varijablu startost trebalo deklarirat kao privatnu a ne kao javnu bez obzira sto je to test primjer ali onoliko ic u detalje i pisat sve ono nema smisla a povrh svega zbunjuje covjeka oko onoga sto zeli naucit.

Detalji su za one koji znaju. Da znaju zbog cega je onaj Tracerov primjer los.

 

Jeronim kaže...
Koliko sam shvatio autor posta jos uci i samu sintaksu jezika pa zar onda ima uopce smisla opterecivat ga dobrom programerskom praksom?

Ispravan primjer je za onog koji zeli nauciti. Zasto da se covjeka uci na losim primjerima? Primjer poput Tracerovog neces naci ni u jednoj knjizi za ucenje C++-a (pa ni onoj namijenjenoj pocetnicima), osim eventualno kao primjer za los/pogresan nacin skrivanja clanova.

 

tnakir kaže...
mbaksa kaže...

int main(){
    Osoba Ante;
    Ante.SetGodinaRodjenja(1990);

   Ante.starost = 389;

    cout << "Antina starost: " << Ante.starost;  // dobar rezulat (zaista?)
    cin.get();
    return 0;
}

Toliko o cjepidlacenju i o tome sto ja zapravo hocu. Belji se

Momku klase same po sebi nisu sjele, nezna razliku izmedju private / public / protected i onda ga jos zbunjivat sa ovim? Pomalo... put od tisucu milja pocinje prvim korakom.

Zbunjivat s cim konkretno? Iz tog primjer se jasno vidi da je Tracerov primjer pogresan. Tu i svaki pocetnik vidi da ne smije biti moguce promijeniti varijablu starost izvan klase. O cemu onda ti pricas?

Poanta je bila da mu pokaze smisao get() set() funkcija. To sto je tu zalutala starost je toliki problem. Nema smisla sa tobom prepirat, ti si uvjek u pravu tako da... eto, povlacim se iz rasprave.

I'm going woo woo
17 godina
moderator
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
tnakir kaže...
mbaksa kaže...

Zbunjivat s cim konkretno? Iz tog primjer se jasno vidi da je Tracerov primjer pogresan. Tu i svaki pocetnik vidi da ne smije biti moguce promijeniti varijablu starost izvan klase. O cemu onda ti pricas?

Poanta je bila da mu pokaze smisao get() set() funkcija. To sto je tu zalutala starost je toliki problem. Nema smisla sa tobom prepirat, ti si uvjek u pravu tako da... eto, povlacim se iz rasprave.

Jesi ti uopce citao njegove postove na temi? Evo sto Tracer doslovce kaze:

 

Tracer kaže...
Uostalom, već sam rekao da meni nije bio cilj objasniti get i set već nešto drugo

I sto sad da ti covjek kaze?

 

Poruka je uređivana zadnji put pon 23.8.2010 9:20 (mbaksa).
15 godina
neaktivan
offline
Smisao zaštite varijabli i funkcija unutar klasa?

Nije to sad toliko strasno za previse inzistirat na tome u krajnjoj liniji kad malo bolje razmislis nije ni na odmet jer ako je onaj ko cita to prvi put pokusa svatit to na primjeru te jedne variable i sam moze (bi terbao) shvatit da isto to onda nestima sa drugon variablon u tom slucaju ce si postavit pitanje/testirat i u konacnici ce puno bolje zapantit.

 

Sta se tice ovako  "pogresnih" primjera nije da ih nema ako uzmes neke kompleksnije stvari jednostavno ih nije moguce "lako" svatit ako ti neko sad napise sve tocno nego napise krivo pa manje krivo pa jos manje krivo dok te nedovede do onoga pravoga istina jest da je na kraju uvjek (najcesce!) potpuno tocan dgovor ali ka sta san vec napisa ovako male greske neka znaju koristit vise nego stetit.

 

 

 
0 0 hvala 0
17 godina
moderator
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
Jeronim kaže...

Nije to sad toliko strasno za previse inzistirat na tome u krajnjoj liniji kad malo bolje razmislis nije ni na odmet jer ako je onaj ko cita to prvi put pokusa svatit to na primjeru te jedne variable i sam moze (bi terbao) shvatit da isto to onda nestima sa drugon variablon u tom slucaju ce si postavit pitanje/testirat i u konacnici ce puno bolje zapantit.

Sve to je jako upitno. Prvo se tu tvrdi da je covjek koji tako nesto pita totalni pocetnik, koji nema pojma kako funkcioniraju klase - kako onda od njega mozes ocekivati da ce sigurno skuziti gdje je problem? Pogotovo ako mu ne das primjer u kojem ce moci testirati ono o cemu je rijec? Traces je svoj primjer em nepotrebno zakomplicirao (isao koristiti dva clana) i onda jos sve to pogresno povezao.

 

Jeronim kaže...
Sta se tice ovako  "pogresnih" primjera nije da ih nema ako uzmes neke kompleksnije stvari jednostavno ih nije moguce "lako" svatit ako ti neko sad napise sve tocno nego napise krivo pa manje krivo pa jos manje krivo dok te nedovede do onoga pravoga istina jest da je na kraju uvjek (najcesce!) potpuno tocan dgovor ali ka sta san vec napisa ovako male greske neka znaju koristit vise nego stetit.

Takve greske znaju koristiti ako se uoce! Ja sam ih uocio, obrazlozio i ponudio ispravno rjesenje, a onda se tu nadje nekolicina koja tvrdi da je ono pogresno zapravo i dalje OK! Kao da ne vide u cemu je problem! Kao da ne razumiju ili ne znaju o cemu se radi! Kome takav nacin "rasprave" koristi?!

 

 

Evo jednostavan ispravan primjer, primjer kakvog je Tracer (ili tko drugi) trebao odmah napisati, a ne da odma krene s dva clana i jos k tome to pogresno napravi:

 

#include <iostream>

using namespace std;

class Osoba{
    private:
       int starost;
    public:     
      void SetStarost(int n){
       if (n >= 0) {
         starost = n;
        } else {
           cout << "Starost ne moze biti negativna!" << endl;
           throw;
        }
      }
    
      int GetStarost() {
        return starost;
      }
};


int main(){
    Osoba Ante;

   Ante.SetStarost(54);
    cout << "Antina starost: " << Ante.GetStarost() << endl;  // dobar rezulat == 54
   
   Ante.SetStarost(-35);
   cout << "Antina starost: " << Ante.GetStarost() << endl;  // starost ostaje == 54, jer je upisan negativni broj za starost!
   
   Ante.starost = 57;  // kompajler javlja gresku - program s ovom linijom se uopce ne moze kompajlirati
   Ante.starost = -384;    //       - " -
    Ante.starost = 548898;  //       - " -
   
    cin.get();
    return 0;
}   

 

Evo, ovo je ispravan primjer, jednostavan primjer s jednom varijablom. Znaci, sakrije se varijabla starost tako da se deklarira kao privatna, kako se njezina vrijednost ne bi mogla direktno mijenjati izvan klase. Zato napisemo public funkciju SetStarost (tzv. setter) koja ce omoguciti omoguciti promjenu privatne varijable starost, ali samo ukoliko vrijednost zadovoljava odredjene uvjete - u ovom slucaju da bude veca ili jednaka nuli. Skrivanje varijable starost za posljedicu ima i to da je ne mozemo procitati izvan klase - to znaci da cemo i za tu namjenu morati napisati jednu funkciju - to ce biti tzv. getter funkcija, koja ce vracati vrijednost varijable starost.

 

Ima i tu prostora za diskusiju - na primjer, da li da se varijabla starost resetiran na neku vrijednost ako se upise negativna vrijednost? Takodjer, sto je s konstruktorom - ne bi li u njemu trebalo definirati inicijalnu vrijednost varijable? Itd...

 

Za slozeniji primjer, s dva (zavisna) clana, vec prije sam ispravio Tracerov kod i detaljno ga objasnio.

Poruka je uređivana zadnji put pon 23.8.2010 9:55 (mbaksa).
14 godina
neaktivan
offline
Smisao zaštite varijabli i funkcija unutar klasa?

Kako ja još praktički nemam pojma o programiranju nemogu prosuđivati kakav je primjer :/ samo da ne dolazi do nekih prepiranja....

Tvoj novi primjer mi je pojasni totalnu svrhu trpanja u private tako da zahvaljujem ;)

Moj PC  
0 0 hvala 0
16 godina
odjavljen
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
Pijavica kaže...

Kako ja još praktički nemam pojma o programiranju nemogu prosuđivati kakav je primjer :/ samo da ne dolazi do nekih prepiranja....

Tvoj novi primjer mi je pojasni totalnu svrhu trpanja u private tako da zahvaljujem ;)

Nemoj misliti da je to to. To je samo osnova na kojoj ćeš učit dalje, a kad apsolviraš neke osnove vezane za klase, onda tek možeš smatrati da si počeo učit C++.

Heart: _/\_/\_/\_/\_/\_/\_/\_/\_ Brain: __________________________
17 godina
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
MrBlc kaže...
Pijavica kaže...

Kako ja još praktički nemam pojma o programiranju nemogu prosuđivati kakav je primjer :/ samo da ne dolazi do nekih prepiranja....

Tvoj novi primjer mi je pojasni totalnu svrhu trpanja u private tako da zahvaljujem ;)

Nemoj misliti da je to to. To je samo osnova na kojoj ćeš učit dalje, a kad apsolviraš neke osnove vezane za klase, onda tek možeš smatrati da si počeo učit C++.

O ovome sam ja i pricao. Osnove klasa, a ne osnove programiranja ili kako napisati dobar algoritam ili dobru klasu. Tracer je odgovorio na zasto, a mbaksa na šta bi bilo kad bi bilo...

I'm going woo woo
16 godina
neaktivan
offline
RE: Smisao zaštite varijabli i funkcija unutar kla

Zanima me kad autor bude pitao o virtualnim funkcijama (metodama) abstraktim klasama,naslijeđivanju konstruktora itd itd ...kakvi će tek tu programi, kodovi sjevati a tek rasprave Nevinašce.....bit jest nauči i shvati ali ovo me podsjeća na neke rasprave u prošlosti ,mislim da zato na ovom forumu nisu niti zaživjeli neki tutorijali o programskim jezicima(niti će zaživjeti)  .Uvijek se traži greška makar bila i "dobronamjerna" .Dok recimo na policama naših knjižara ima dosta primjera "lošeg programiranja u dobrim knjigama " ,a opet su prodane i progutane iako su pregledane i odobrene od "profi" ljudi struke.Šteta,obojica ste u pravu ma koliko jedan ispravljao drugoga ,gledajući sa strane .Ponekad se pitam dali mi se isplati pisati kod koji radi i objasni problem na temelju kojeg se i shvati sve ,a taj kod nije "savršen" ....jer filter forumaša i moderatora je postao rigorozno  usavršen do te mjere da se moraš paziti i gdje se točka zarez ili endl piše.Hajde da kod baš ništa ne objašnjava ili pogrešno napisan ,onda ok ali......
Naravno ,onaj koji uči i polako usvaja znanje i sam će shvatiti bit tog "starog koda" i sam se sebi nasmijati da je uopće to pitao.Zato tutovi koji kreću od početka na forumima nema šanse da se dovrše do samog kraja iz milon nedostataka(ili prednosti->moderatori,forumaši->kritičari) foruma (bilo kojeg)....

Private
14 godina
neaktivan
offline
Smisao zaštite varijabli i funkcija unutar klasa?

INače koristim se lekcijama sa ovog linka koji me se ne čini baš najboljim,ako ima netko neki poblji za preporučiti-

...slobodno =D.Btw Svjestan sam da je to tek shvaćanje osnova,a kako napredujem relativno sporo nikako mi nepada napamet umišljati si da znam nešto puno =S

Moj PC  
0 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice