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

poruka: 175
|
čitano: 45.148
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
protjeran
offline
Smisao zaštite varijabli i funkcija unutar klasa?

Probaj ovdje:

 

http://www.cplusplus.com/

http://www.cplusplus.com/doc/tutorial/

 

Ima jako puno sadržaja, dokumentacije, primjera, a i forum.

Poruka je uređivana zadnji put pon 23.8.2010 22:32 (Tracer).
Moj PC  
0 0 hvala 0
17 godina
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
Private kaže...

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)....

Bolje da si ti reko nego ja...

I'm going woo woo
17 godina
moderator
online
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 ;)

Drago mi je da ti je pomogao - ako te jos sto zanima, samo pitaj. Komentar ti je na mjestu - ti ni ne bi trebao prosudjivati kakav je primjer - ti bi trebao ocekivati, kao clan jednog kvalitetnog informatickog foruma, da ti programerska elita na ovoj temi da ispravan primjer. A ne da ti daju los i nepotrebno zakompliciran primjer i onda kvocaju kad ih se ispravlja.

 

Inace, evo sto Demistificirani C++ (drugo izdanje, 2001., str. 693) kaze o data hidingu ("sučelje" o kojem se govori su clanovi s public pravom pristupa, "implementacija" private iliti skriveni, "okolina" je kod izvan objekta/klase) - mozda ti jos malo ucvrsti taj koncept:

Za uspješnu primjenu objektno orijentiranog pristupa modeliranja sustava vrlo je važno što dosljednije provoditi gornji postupak kojim se implementacija razdvaja od sučelja. Taj postupak se naziva skrivanje podataka (engl. data hiding); svaki objekt pruža okolini upravo onoliko informacija koliko je potrebno da bi okolina mogla uspješno komunicirati s njime. Implementacijski detalji su skriveni, jer okolina o njima niti ne mora voditi računa.

Programi pisani tako da se strogo pridržavaju principa skrivanja informacija vrlo rijetko omogućavaju direktan pristup podatkovnim članovima. Podatkovni članovi su implementacija, a sučelje se najčešće osigurava pomoću funkcijskih članova. (...)

 

Sad usporedi to s Tracerovim primjerom. Zapravo, ne znam dal ces ti moci, ali ovih nekoliko filozofa na ovoj temi bi to trebalo moci. I njima bi, ako uopce znaju programirati i shvacaju principe objektno orijentiranog primjera, trebalo biti jasno zasto primjer nije dobar. Osnovni koncept OOP-a je otkrij okolini samo ono sto joj treba biti vidljivo - zato su clanovi klasa po defaultu privatni (private), za razliku od struktura gdje su po defaultu javni (public).

 

 

Inace, situacija na ovoj temi podsjeca me na jednu raspravu s tipom koji je radio rekurziju, a da pritom uopce nije koristio vrijednost funkcij koju je rekurzivno pozvao! Evo njegov izvorni kod:

int euklid_alg(int a, int b){
    /*euklidov algoritam pomocu rekurzivne funkcije (funkcija koja poziva sama sebe*/
    int mod=a%b;
    if (mod==0)
       return b;
    a=b;
    b=mod;
    euklid_alg(a,b);
}//euklid

 

I pocetnik bi trebao odmah uociti da ova funkcija u osnovi nista ne radi - odnosno, radi "u praznom hodu" (osim, naravno, ako vec u prvom pozivu funkcije a%b==0, dakle kad ni ne dolazi do rekurzije). No, on tvrdi da je to dobro, njemu radi - ja mu objasnjavam da to ne valja i zasto ne valja, ali nikako da mu "dokazem" da to ne valja, on stalno tvrdi njemu to radi (ja program nisam niti pokrenuo - vec iz samog koda se jasno vidjelo da je to pogresno). Ja ispadnem bad guy zato jer prigovaram zbog pogresnog koda! Sve dok nije napravio ono sto sam mu rekao - nek proba taj kod u Dev-C++-u ili Watcomovom C++-u. E, tu program vise nije radio (zapravo, Watcomov C++ program nije ni zelio ni kompajlirat!). Stvar je bila u tome da je MS Visual C++ ostavio rezultat zadnje operacije na stacku, koji je slucajno bio ono sto je trebala biti povratna vrijednost. Dakle, da bi funkcija radila kako treba, zadnja linija je trebala glasiti return euklid_alg(a,b);

 

Sto ce reci - neke stvari vam se mogu ciniti ispravne, iako to nisu. Pogotovo ako ste pocetnik. I nema nista strasno u tome ako vam to izgleda ispravno - vazno je prihvatiti kritiku, uociti gresku, korigirati stvari i - nauciti nesto iz toga. Pa upravo zbog toga ste i dosli na ovaj podforum, zar ne? Ili?

 

Tracer zna zbog cega prigovaram njegovom primjeru - ocekivao sam da kao iskusan programer da u najmanju ruku ispravan primjer, te sto je moguce jednostavniji. Kako on to nije ucinio, dao sam dva ispravna primjera - jedan kompliciraniji, i jedan jednostavniji. I oba primjera precizno i tocno pokazuju ono sto si pitao. Ostatak ekipe samo pretace iz supljeg u prazno - ne daju apsolutno nikakav doprinos temi, samo neargumentirano i pausalno "filozofiraju" - rade upravo ono za sto mene optuzuju da radim - primjer:

tnakir kaže...

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...

Private kaže...

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)....

U ovakvim pausalnim filozofskim postovima niti itko igdje argumentira zbog cega je Tracerov primjer dobar kao primjer za data hiding, niti itko igdje argumentira cak ne ni to zasto bi moj primjer bio los, niti ne tvrde da su moji primjeri losi. Halo - o cemu je tu rijec?!

 

Teme u ovom podforumu trebale bi biti namijenjene edukaciji. Nitko ne trazi da kod bude savrsen u svakom pogledu, ali to podrazumijeva da se daju ispravni primjeri, to podrazumijeva prihvacanje konstruktivne kritike na kod, to podrazumijeva da se neispravan kod korigira kako bi postao ispravan. To podrazumijeva raspravu zasto je neki kod ispravan, a neki neispravan. To je proces ucenja! To ne podrazumijeva filozofiranje treba li (konstruktivno) kritizirati neciji kod ili ne - pa nije ovo forum posvecen psihologiji! Molim forumase, a pogotovo ove filozofe, da konstruktivno sudjeluju u raspravi - da daju neki koristan doprinos, umjesto da odlaze u off-topic. Jedini koji su konstruktivno doprinijeli raspravi su Tracer i r00t.

17 godina
moderator
online
Smisao zaštite varijabli i funkcija unutar klasa?

Tracer je predlozio, i u osnovi se slazem s njim, da bi trebalo zakljucati ovu temu. Pretjeralo se s off-topicarenjem. Temu cu zasad ostaviti otvorenom, u nadi ce se pojaviti kakvo pitanje vezano uz objektno orijentirano programiranje ili kakav pametan komentar, no zatvaram je nastavi li se s off-topicima.

 

Poruka je uređivana zadnji put uto 24.8.2010 0:55 (mbaksa).
 
0 0 hvala 0
14 godina
neaktivan
offline
Smisao zaštite varijabli i funkcija unutar klasa?

Pa novih pitanja će svakako biti od mene :)..Kako nebi Zatvorili temu možda bi preimovanje u "brza pitanja iz objektnog programiranja"  moglo pomoći još nekome..Slažete se?

 

Moj PC  
0 0 hvala 0
17 godina
moderator
online
RE: Smisao zaštite varijabli i funkcija unutar kla

Ako ti ili netko drugi pocne postavljati brza pitanja iz objektno orijentiranog programiranja, onda cu joj promijeniti naslov.

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

pa evo jednog...ovdje se u klasi deklariraju funkcije dog i ~dog,koje su jednostavno prazne.Navodno se radi o nekakvim konstruktorima i dekonstruktorim.Nakon sto sam donekle shvatio svrhu privatea krenuo sam dalje s lekcijama,zaboravšivši na njih =S. Dakle pitanje je  čemu one služe?(Objašnjenje na stranici uopće ne razumijem tako da ne ukazujete na to :))

Moj PC  
0 0 hvala 0
17 godina
moderator
online
RE: Smisao zaštite varijabli i funkcija unutar kla

Funkcije dog i ~dog su konstruktor i destruktor. Konstruktor se automatski poziva prilikom stvaranja objekta (u slucaju statickih objekata, kao u ovom slucaju, kod deklaracije, dok kod dinamickih objekata kad koristis operator new). Destruktor se automatski poziva prilikom unistavanja objekta - kad program izadje iz dijela koda u kojem je deklariran staticki objekt ili kad se dinamicki instanciran objekt unisti naredbom delete, ako se ne varam).

 

Pogledaj ovaj dopunjen primjer:

 

#include <iostream>

using namespace std;

class dog{
public:
    dog();
    ~dog();
    int getAge();   
    void setAge(int a);

protected:
    int age;
};

dog::dog(){
    age = 25;
}

dog::~dog(){
    cout << "Dog sad mora ici spavati!\n";
    system("pause");

}

int dog::getAge(){
    return age;
}

void dog::setAge(int a){
    age = a;
}

int main(){
    dog myDog;    // ovdje se automatski pozvao konstruktor dog()
    cout << "The dog is " << myDog.getAge() << " years old!\n"; // vraca vrijednost 25 (vrijednost definiranu u konstruktoru)

    myDog.setAge(5);   
    cout << "The dog is " << myDog.getAge() << " years old!\n"; // vraca vrijednost 5

    system("pause");

    return 0;  // ovdje se automatski pozvao destruktor ~dog() - znaci, ispisuje se tekst "Dog sad mora ici spavati!"
}

 

Zuto su dodane linije. Mislim da bi sve trebalo biti jasno iz  komentar u kodu. Ako nije - pitaj.

 

 

Ako te zanima dinamicko stvaranje objekata, odna bi kod izgledao poput ovog (pazi - tu sad varijabla preko koje cemo pristupati objektu ima * - znaci da je to pokazivac - clanovima objekta se sad vise ne pristupa preko tocke, nego preko ->):

dog *dinamickiDog = new dog();   // dinamickiDog se kreira (konstruktor se eksplicitno poziva)
cout << endl << "Dinamicki pas je star: " << dinamickiDog->getAge() << endl;  // ispisuje 25, jer je toliko definirano u konstruktoru
delete dinamickiDog;  // unisti se objekt, sto za posljedicu ima pozivanje destruktora - znaci, ispisuje se dinamickiDog ide spavati

14 godina
neaktivan
offline
RE: Smisao zaštite varijabli i funkcija unutar kla

Razumijem konstruktor i destruktor...Ali ne razumijem kakvo je to dinamičko stvaranje objekata =/,po čemu se razlikuje od statičkog

17 godina
protjeran
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
Pijavica kaže...

Razumijem konstruktor i destruktor...Ali ne razumijem kakvo je to dinamičko stvaranje objekata =/,po čemu se razlikuje od statičkog

Razlika je nekoliko:

 

1. Statički kreirani objekti se nalaze na stogu (stack) a dinamički kreirani na heapu.

2. Redoslijed kreiranja: prvo se kreiraju statički (automatski) a zatim "ručno" se kreiraju oni dinamički (operator new).

3. Redoslijed uništavanja: prvo dinamički (operator delete), a zatim statički (automatski).

 

Npr.:

#include <iostream>
using namespace std;

class A{
    public:
       int id;
       A(int id){
          this->id = id;
          cout << "Stvoren objekt tipa A (" << id << ")\n";
       }
       ~A(){
          cout << "Unisten objekt tipa A (" << id << ")\n";
       }
};
int main(){
    A obj1(1), obj2(2); // statički kreirani objekti
    A *obj3, *obj4; // pokazivači na objekte

    obj3 = new A(3); // dinamičko kreiranje (alokacija) objekta
    obj4 = new A(4);

    delete obj3;  // uništavanje dinamički kreiranog objekta (dealokacija)
    delete obj4;
    return 0;
}

 

 

Ono što bi program trebao ispisati je sljedeće:

 

Stvoren objekt tipa A (1)  - statički (obj1)

Stvoren objekt tipa A (2)  - statički (obj2)

Stvoren objekt tipa A (3)  - dinamički kreiran (obj3)

Stvoren objekt tipa A (4)  - dinamički kreiran (obj4)

Unisten objekt tipa A (3)  - dinamički kreiran (obj3)

Unisten objekt tipa A (4)  - dinamički kreiran (obj4)

Unisten objekt tipa A (2)  - statički (obj2)

Unisten objekt tipa A (1)  - statički (obj1)

 

Znači, objekti kreirani statički odmah pozivaju konstruktor pri deklaraciji a oni dinamički kreirani tek nakon kreiranja operatorom new. Također, za statički kreirane objekte destruktor se automatski poziva na kraju dok za dinamički kreirane objekte onda nakon što se unište operatorom delete.

Poruka je uređivana zadnji put uto 24.8.2010 3:48 (Tracer).
17 godina
moderator
online
RE: Smisao zaštite varijabli i funkcija unutar kla
Pijavica kaže...

Razumijem konstruktor i destruktor...Ali ne razumijem kakvo je to dinamičko stvaranje objekata =/,po čemu se razlikuje od statičkog

Tracer je opisao kako se sto koristi, a ja cu pokusati objasniti zasto se to uopce radi i napraviti to na primjeru spomenutog doga.

 

Dakle, kod statickog stvaranja objekata oni se stvaraju kod deklaracije. Znaci, ako ti treba jedan pas, deklarirat ces jednog psa. Ako ti treba (maksimalno) deset pasa, zar ces onda imati dog pas1, pas2, pas3...pas10; ? Jesi li siguran da ti je deset pasa dosta - sto ako zapravo postoji mogucnost da ti treba 10000 pasa? Da, mozes napraviti vektor dog myDogs [10000]; Svi ti objekti ce biti kreirani kod deklaracije - znaci, cak i ako ti koristis samo jedan jedini objekt, ako mislis da ce ti trebati maksimalno 10000 pasa, ti odmah moras kreirati 10000 pasa! To znaci i da ce taj vektor zauzeti memorije za 10000 pasa! A ti mozda koristis samo jedan ili dva, ali netko ce u nekom trenutku mozda koristiti i 5000. Ili mozda 15000? Ne moze 15000, jer si rezervirao memoriju samo za 10000 pasa. Sto ako mora jos zivine imati, a ne samo pse? Uludo bi se trosila memorija i procesorsko vrijeme na kreiranje i unistavanje svih tih objekata.

 

Kod dinamickog stvaranja objekata stvoris objekt samo kad ti treba. I stvoris ih samo onoliko koliko ih treba. I to tipova (klasa) kojih ti treba. Znaci, jedas pas, tri macke i deset jazavaca. Kad ti vise ne trebaju, onda ih unistis (obrises) naredbom delete (pri cemu se poziva destruktor), pa stvoris druge dok ti trebaju. Naravno, kod dinamickog stvaranja objekata uvijek moras imati barem jedan pokazivac na stvoreni objekt. Pa recimo ako imas listu pasa, imat ces varijablu/pokazivac na prvi objekt klase dog u listi, a klasu pas ces prosiriti s pokazivacem na sljedeceg psa.

 

Klasa dog (ako ce se ona koristiti za ulancavanje objekata) bi sad mogla izgledati recimo ovako:

 

class dog{
public:
    dog();
    ~dog();
    int getAge();   
    void setAge(int a);
   dog *sljedeciDog;
protected:
    int age;
};

dog::dog(){
    age = 25;
   sljedeciDog = 0;
}

dog::~dog(){
   cout << "Dog sad mora ici spavati! On sad ima " << age << " godina.\n";
    system("pause");
}

int dog::getAge(){
    return age;
}

void dog::setAge(int a){
    age = a;
}

Znaci, dodan je clan sljedeciDog, koji je pokazivac na objekt klase dog. Njega smo u konstruktoru postavili na 0, znaci da ne pokazuje ni na jedan objekt - dakle, u tom trenutku nema sljedeceg psa. I sad, kako to iskoristiti? To je malo slozenije...

 

    cout << "Upisi broj pasa: ";
    int brojPasa;
    cin >> brojPasa;
   
    dog *listaPasa = 0;  // pokazivac na prvi objekt
    dog *trenutniPas = 0; 

    if (brojPasa > 0) {  // ako se trazi kreiranje barem jednog objekta
        for (int i = 0; i < brojPasa; i++) { // vrti se petlja onoliko puta koliko je pasa upisano
            dog *noviPas = new dog();  // dinamicki se kreira novi objekt klase dog
            noviPas->setAge(i+1);      // postavlja mu se broj godina
            if (listaPasa == 0) { listaPasa = noviPas; trenutniPas = noviPas; } /* ako je ovo prvi objekt, odnosno ako je lista objekata prazna, onda treba napraviti da lista objekata listPasa pokazuje na taj prvi element - na objekt noviPas; takodjer, trenutniPas u tom trenutku je taj prvi kreirani objekt klase dog */
            else {
                trenutniPas->sljedeciDog = noviPas;   // ovime kazemo da clan sljedeciDog prezadnje kreiranog objekta postaje novokreirani objekt noviPas;
                trenutniPas = noviPas;  // pokazivas trenutniPas sad pokazuje na novokreirani objekt noviPas
            }
        }
       
    }

 

Znaci, tu se trazi unos broj pasa, vrti se petlja u kojoj se kriraju objekti klase dog i ulancavaju se preko clana sljedeciDog. Ako ti to nije bas najjasnije, to ti izgleda kao na slici.

 

Ulancavanje preko pokazivaca Ulancavanje preko pokazivaca
 

 

Pokazivac trenutniPas selimo s objekta na objekt, kako bismo radili s tocno odredjenim objektom.

 

 

Ako objekte ne obrisemo kad nam vise ne trebaju, nas program i dalje za njih ima rezerviranu memoriju. Evo kako bi ih obrisali:

 

    trenutniPas = listaPasa;
   
    while (trenutniPas != 0) {
        dog *pasZaBrisanje = trenutniPas;
        trenutniPas = trenutniPas->sljedeciDog;       
        delete pasZaBrisanje;
    }
   
    listaPasa = 0;

 

Znaci, preko pokazivaca trenutniPas idemo od jednog do drugog psa i unistavamo naredbom delete jedan po jedan objekt.

 

 

Naravno, kod mnogih danasnjih programskih jezika ti ne moras rucno raditi takvo ulancavanje objekata - postoje klase koje omogucavaju dodavanje objekata u listu, brisanje iz liste, pa cak i sortiranje ako im das odgovarajuce kriterije. Ne mogu ti nista vise o tome reci vezano uz C++, jer nisam s tim radio.

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

Razumijem konstruktor i destruktor...Ali ne razumijem kakvo je to dinamičko stvaranje objekata =/,po čemu se razlikuje od statičkog

Tracer je opisao kako se sto koristi, a ja cu pokusati objasniti zasto se to uopce radi i napraviti to na primjeru spomenutog doga.

 

Dakle, kod statickog stvaranja objekata oni se stvaraju kod deklaracije. Znaci, ako ti treba jedan pas, deklarirat ces jednog psa. Ako ti treba (maksimalno) deset pasa, zar ces onda imati dog pas1, pas2, pas3...pas10; ? Jesi li siguran da ti je deset pasa dosta - sto ako zapravo postoji mogucnost da ti treba 10000 pasa? Da, mozes napraviti vektor dog myDogs [10000];Svi ti objekti ce biti kreirani kod deklaracije - znaci, cak i ako ti koristis samo jedan jedini objekt, ako mislis da ce ti trebati maksimalno 10000 pasa, ti odmah moras kreirati 10000 pasa! To znaci i da ce taj vektor zauzeti memorije za 10000 pasa! A ti mozda koristis samo jedan ili dva, ali netko ce u nekom trenutku mozda koristiti i 5000. Ili mozda 15000? Ne moze 15000, jer si rezervirao memoriju samo za 10000 pasa. Sto ako mora jos zivine imati, a ne samo pse? Uludo bi se trosila memorija i procesorsko vrijeme na kreiranje i unistavanje svih tih objekata.

Ovdje vidim potpuno nerazumijevanje stvari jer ovo podebljano uopće ne mora biti točno, a pogotovo ako je definicija objekta takva da njegova instanca zauzima veću količinu memorije. Razlog "zašto" sigurno nije u tome da li se dvoumiš između 5, 10 ili 15 tisuća pasa jer u programerskoj praksi nikada nećeš toliki broj objekata kreirati statički i time staviti ih na stog (kao ti u ovom primjeru) jer ćeš najednom dobiti "Stack Overflow". Veličina Stoga je ograničena i zato se ovoliko veliki broj elemenata uvijek treba kreirati dinamički kako bi ih se smjestio na heap pa čak i ako znaš odmah na početku koliko ih ima. Stoga, ovaj primjer nije dobar.

 

mbaksa kaže...
Kod dinamickog stvaranja objekata stvoris objekt samo kad ti treba. I stvoris ih samo onoliko koliko ih treba. I to tipova (klasa) kojih ti treba. Znaci, jedas pas, tri macke i deset jazavaca. Kad ti vise ne trebaju, onda ih unistis (obrises) naredbom delete (pri cemu se poziva destruktor), pa stvoris druge dok ti trebaju.

naredbe su if, switch, for itd., a delete nije naredba već operator podložan preopterećenju (velika razlika!).

 

mbaksa kaže...
Naravno, kod dinamickog stvaranja objekata uvijek moras imati barem jedan pokazivac na stvoreni objekt. Pa recimo ako imas listu pasa, imat ces varijablu/pokazivac na prvi objekt klase dog u listi, a klasu pas ces prosiriti s pokazivacem na sljedeceg psa.

Početniku sigurno ne treba objašnjavati pokazivače i dinamičke objekte uvođenjem još kompleksnijeg pojma poput liste. Usto, lista ne mora uopće biti sastavljena od dinamički kreiranih objekata već ju mogu činiti i statički objekti čije se adrese predaju listi. Stoga, niti ovaj primjer ne smatram dobrim, a niti na razini za početnika. Moglo se puno jednostavnije kao što se to svugdje radi: Primjerom dinamičke alokacije polja (vektora).

 

 

 

Poruka je uređivana zadnji put uto 24.8.2010 9:56 (Tracer).
17 godina
moderator
online
RE: Smisao zaštite varijabli i funkcija unutar kla
Tracer kaže...
mbaksa kaže...

Dakle, kod statickog stvaranja objekata oni se stvaraju kod deklaracije. Znaci, ako ti treba jedan pas, deklarirat ces jednog psa. Ako ti treba (maksimalno) deset pasa, zar ces onda imati dog pas1, pas2, pas3...pas10; ? Jesi li siguran da ti je deset pasa dosta - sto ako zapravo postoji mogucnost da ti treba 10000 pasa? Da, mozes napraviti vektor dog myDogs [10000];Svi ti objekti ce biti kreirani kod deklaracije - znaci, cak i ako ti koristis samo jedan jedini objekt, ako mislis da ce ti trebati maksimalno 10000 pasa, ti odmah moras kreirati 10000 pasa! To znaci i da ce taj vektor zauzeti memorije za 10000 pasa! A ti mozda koristis samo jedan ili dva, ali netko ce u nekom trenutku mozda koristiti i 5000. Ili mozda 15000? Ne moze 15000, jer si rezervirao memoriju samo za 10000 pasa. Sto ako mora jos zivine imati, a ne samo pse? Uludo bi se trosila memorija i procesorsko vrijeme na kreiranje i unistavanje svih tih objekata.

Ovdje vidim potpuno nerazumijevanje stvari jer ovo podebljano uopće ne mora biti točno, a pogotovo ako je definicija objekta takva da njegova instanca zauzima veću količinu memorije. Razlog "zašto" sigurno nije u tome da li se dvoumiš između 5, 10 ili 15 tisuća pasa jer u programerskoj praksi nikada nećeš toliki broj objekata kreirati statički i time staviti ih na stog (kao ti u ovom primjeru) jer ćeš najednom dobiti "Stack Overflow". Veličina Stoga je ograničena i zato se ovoliko veliki broj elemenata uvijek treba kreirati dinamički kako bi ih se smjestio na heap pa čak i ako znaš odmah na početku koliko ih ima.

Ne mora biti moguce staticki kreirati toliko objekata, ali moze biti moguce - konkretno, u Dev-C++-u (MingW) kreirao sam ne 5, 10 ili 15 tisuca, nego ni manje ni vise nego 259428 pasa. Da, da objekt zauzima vec kolicinu memorije, mogao bi ih manje kreirati. Sve to ne znaci da pocetnik nece napraviti staticki vektor objekata isto kao sto bi npr. napravio staticki vektor int-ova ili structova. Napravit ce to ako ne zna dinamicki kreirati objekte, a treba mu vise od onoliko koliko mu se da deklarirati kao pas1, pas2, pas3... I nije to stvar samo memorije (2,1 megabajt u ovom ekstremnom slucaju) - stvar je i nepotrebnog trosenja procesorskog vremena za konstruktor i destruktor u biti nepotrebnih objekata.

 

Nisam isao u razglabanje o stogu i heapu, jer rijetko kad znas koliko tocno objekata ce ti trebati - mozes eventualno znati ili pretpostavljati maksimum. Kod staticki deklariranog vektora moras raditi s maksimumom. Kod dinamicke alokacije vektora objekata situacija se poboljsava, no ti i dalje imas vektor fiksne velicine, samo sto ga dinamicki alociras. A to znaci da ako hoces dodati jos jedan objekt - imas velikih problema. Takodjer, i kod dinamicke alokacije konstruktor se poziva prilikom kreiranja cijelog vektora (!) - znaci, ni kod dinamicke alokacije vektora objekata nije nuzno da ces moci iskoristiti konstruktor - na primjer, da konstroktoru psu dodijelis ime koje je argument (a da svi psi nemaju isto ime, ofkors), nego moras naknadno prolaziti kroz cijeli vektor. Takodjer, i kod dinamicke alokacije vektora objekata ti moras znati koliko ces objekata kreirati! Kako ces napraviti vektor objekata ako prvo neces traziti unos broja objekata? Belji se Kad kreiras objekt po objekt, onda s tim nemas problema:

 

    cout << "Unosi starost pasa, jednog po jednog (-1 za kraj unosa):\n";

    int starostTrenutnog;
   
    do {   
       dog *noviPas = new dog();
       cin >> starostTrenutnog;
       noviPas->setAge(starostTrenutnog);
      
       if (starostTrenutnog >= 0) {
           if (listaPasa == 0) { listaPasa = noviPas; trenutniPas = noviPas; }
           else {
             trenutniPas->sljedeciDog = noviPas;
             trenutniPas = noviPas;
           }
       }

    } while (starostTrenutnog >= 0);

Ili jos bolje, mozemo promijeniti defaultni konstruktor, ili dopisati novi, pomocu kojeg se moze odrediti starost psa:

 

dog::dog(int starost){
    age = starost;
    sljedeciDog = 0;
}

 

Pa onda kreiranje nepoznatog broja objekata izgleda ovako:

 

    cout << "Unosi starost pasa, jednog po jednog (-1 za kraj unosa):\n";

    int starostTrenutnog;
   
    do {   
       cin >> starostTrenutnog;
       dog *noviPas = new dog(starostTrenutnog);
          
       if (starostTrenutnog >= 0) {
           if (listaPasa == 0) { listaPasa = noviPas; trenutniPas = noviPas; }
           else {
             trenutniPas->sljedeciDog = noviPas;
             trenutniPas = noviPas;
           }
       }

    } while (starostTrenutnog >= 0);

 

Kako ces to napraviti s dinamicki alociranim vektorom objekata, a da ne trazis unos broja objekata i da onda naknadno prolazis kroz vektor kako bi definirao svakom psu starost?

 

Stoga kreiranje jednog po jednog ima velike prednosti - em se bezveze ne trosi memorija, em se bezveze ne trosi procesorsko vrijeme, em imas vecu fleksibilnost.

 

 

Ovdje vidim potpuno nerazumijevanje poante moje poruke, pa je jasno zasto to pogresno tumacis kao nerazumijevanje stvari. Velicina stoga moze biti faktor, ali nije jedini faktor niti je nuzno glavni. Dinamicki ces kreirat objekte zato da ih imas u memoriji onda i onoliko koliko ti ih u danom trenutku treba. To ne mozes postici staticki deklariranim objektima ili vektorom objekata, to ne mozes posticki dinamicki alociranim vektorom objekata bez ogranicenja i mogucih problema.

 

Tracer kaže...
mbaksa kaže...
Kod dinamickog stvaranja objekata stvoris objekt samo kad ti treba. I stvoris ih samo onoliko koliko ih treba. I to tipova (klasa) kojih ti treba. Znaci, jedas pas, tri macke i deset jazavaca. Kad ti vise ne trebaju, onda ih unistis (obrises) naredbom delete (pri cemu se poziva destruktor), pa stvoris druge dok ti trebaju.

naredbe su if, switch, for itd., a delete nije naredba već operator podložan preopterećenju (velika razlika!).

Nemoj molim te pokusavati pokazivati da znas vise od mene. Zar cemo sad ici raspravljat o tome sto je, a sto nije naredba? Da, delete je sam po sebi operator (a zapravo i kljucna rijec koja predstavlja operator), a u kontekstu programa delete nesto; je naredba. If, switch, for itd. same po sebi nisu naredbe, nego rezervirane (kljucne) rijeci (ili kako se vec nazivaju u kojem programskom jeziku), koje postaju naredbe kad se koriste u kontekstu programa. switch nije naredba - switch (nesto) { case: 1 ...; } je naredba. U mojoj izjavi jasno je da ces deletat objekte i da se ne bavim operatorom delete kao takvim, nego u kontekstu programa.

 

Preporucio bih ti da uzmes neku knjigu u ruke - mozda nesto i naucis i ispravis neka pogresna "znanja". Mozes vec spominjani Demistificirani C++:

str 22: Znak ; mora zaključivati svaku naredbu u jeziku C++.

str 29: Naredbe u izvornom kodu nisu ograničene na samo jedan redak, već se mogu protezati na nekoliko redaka - završetak svake naredbe jednoznačno je određen znakom ;. Stoga pisanje naredbe možemo prekinuti na bilo kojem mjestu gdje je dozvoljena praznina, te nastaviti pisanje u sljedećem retku

str 133: Uništavanje dinamičkih objekata obavlja se operatorom delete; kada nam više prostor na koji pokaZivac pokazuje nije potreban, napisat ćemo naredbu: delete pokaZivac; Iza ključne riječi delete navodi se ime pokazivača na lokaciju koju treba osloboditi.

str 134: Svaka alokacija new mora biti uparena s odgovarajućom naredbom za oslobađanje istog prostora naredbo delete.

 

Tracer kaže...
mbaksa kaže...
Naravno, kod dinamickog stvaranja objekata uvijek moras imati barem jedan pokazivac na stvoreni objekt. Pa recimo ako imas listu pasa, imat ces varijablu/pokazivac na prvi objekt klase dog u listi, a klasu pas ces prosiriti s pokazivacem na sljedeceg psa.

Početniku sigurno ne treba objašnjavati pokazivače i dinamičke objekte uvođenjem još kompleksnijeg pojma poput liste. Usto, lista ne mora uopće biti sastavljena od dinamički kreiranih objekata već ju mogu činiti i statički objekti čije se adrese predaju listi. Stoga, niti ovaj primjer ne smatram dobrim, a niti na razini za početnika. Moglo se puno jednostavnije kao što se to svugdje radi: Primjerom dinamičke alokacije polja (vektora).

Objasnio sam sad na pocetku ove poruke zasto dinamicka alokacija polja (vektora) ne valja za ovo o cemu sam pisao (recimo kad ne znas koliko objekata ces imati). Covjek bi sad ocekivao da, kad vec (neopravdano) tvrdis da moj primjer nije dobar, da ces ponuditi bolji (ispravan).

 

Namjera mi nije ni bila da pocetnika naucim kako se rade liste - namjera mi je bila samo to da mu pokazem da tijekom izvodjenja programa moze kreirati proizvoljan broj objekata (naravno, ovisi o tome koliko ima memorije na raspolaganju), jedan po jedan, te da se to moze sloziti tako da preko jednog objekta dolazis do drugog. Jer - na neki ih nacin mora povezati. I jos sam to vizualizirao pomocu ilustracije. Moze ih zgurati u polje (vektor) - ali to, kao sto rekoh, cesto nije dobro rjesenje jer ne zna koliko ce objekata imati, a i zato sto kad alociras vektor objekata, pozivaju se konstruktori tih objekata. Mozes imat i vektor pokazivaca, ali ni to nije idealno rjesenje - takodjer moras unaprijed znati koliko ces imati objekata.

 

Da, u svom prethodnom primjer trazio sam unos broja objekata i onda isao preko for petlje - umjesto for petlje moze se (ali i ne mora!) iskoristiti dinamicka alokacija vektora objekata. U ovoj poruci sam pokazao zasto to nije (uvijek) dobro, jer ako ne znas broj objekata i koristis while, odnosno do..while, dinamicki alociran vektor gubi smisao. Pa eto - ako ti onaj primjer nije dovoljno dobar, tu sam ti ponudio primjer s do..while petljom i bez unosa broja objekata. Ja sam ponudio doradjeni primjer. Ako hoces, mogu jos malcice razradjeniji, gdje korisnik sam naredjuje dodavanje novog objekta, koji ce se nastavljati na dotad kreirane objekte - naravno, kod za to vec postoji u aktualnom primjeru - nalazi se unutar do..while petlje.

17 godina
protjeran
offline
RE: Smisao zaštite varijabli i funkcija unutar kla
mbaksa kaže...
Nemoj molim te pokusavati pokazivati da znas vise od mene. Zar cemo sad ici raspravljat o tome sto je, a sto nije naredba?

E pa tu smo dakle. Znači, ok je cjepidlačiti kako se piše if naredba, ali nije ok kad se tebi ukaže na krive principe i stvari? I još ćeš ti meni na kraju upućivati kako da ispravim svoje znanje? Radije se ti pobrini za svoje.

 

EOD

17 godina
moderator
online
RE: Smisao zaštite varijabli i funkcija unutar kla
Tracer kaže...
mbaksa kaže...
Nemoj molim te pokusavati pokazivati da znas vise od mene. Zar cemo sad ici raspravljat o tome sto je, a sto nije naredba?

E pa tu smo dakle. Znači, ok je cjepidlačiti kako se piše if naredba, ali nije ok kad se tebi ukaže na krive principe i stvari? I još ćeš ti meni na kraju upućivati kako da ispravim svoje znanje? Radije se ti pobrini za svoje.

 

EOD

LOL! Pa dokazao sam ti da nisi cjepidlacio, nego si neopravdano/pogresno kritizirao nesto sto sam napisao. To sto si napisao moglo bi se smatrati cjepidlacenjem jedino ako se moja izjava vadi iz konteksta. A to je - valjda znas - logicka pogreska.

 

BTW Preporucam ti da se obratis i autorima Demistificiranog C++-a pa da i njima objasnis sto su naredbe, a sto operatori. Belji se

17 godina
moderator
online
C++ - brza pitanja iz objektno orij. programiranja

Hm... Tko radi, taj i grijesi. Osmijeh Proanalizirajmo malo kod koji sam napisao:

 

    cout << "Unosi starost pasa, jednog po jednog (-1 za kraj unosa):\n";

    int starostTrenutnog;
   
    do {   
       cin >> starostTrenutnog;
      dog *noviPas = new dog(starostTrenutnog);
          
       if (starostTrenutnog >= 0) {
           if (listaPasa == 0) { listaPasa = noviPas; trenutniPas = noviPas; }
           else {
             trenutniPas->sljedeciDog = noviPas;
             trenutniPas = noviPas;
           }
       }

    } while (starostTrenutnog >= 0);

 

Vidimo da se u petlji kreira objekt tipa dog s argumentom konstruktoru starostTrenutnog. Sto se dogadja kad korisnik programa upise -1, kako bi zavrsio s upisivanjem starosti pasa, a time i s dodavanjem objekata? Kreira se objekt, medjutim taj objekt se ne povezuje s ni jednim drugim objektom (nije zadovoljen uvjet starostTrenutnog >= 0), nego kad se izadje iz do bloka naredbi, on ostaje "visjeti" u memoriji, bez da mu se moze pristupiti! Jer ni jedan drugi objekt nema za sljedeciDog tog koji je kreiran sa staroscu -1!

 

Eto, ovo je primjer curenja memorije. Kod dinamicke alokacije objekata treba biti jako pazljiv, da se svaki kreirani objekt u jednom trenutku i unisti, odnosno da ne ostane u memoriji, a da mu se ne moze pristupiti. Jezgra Windowsa Me je imala takve pogreske i to je jedan od razloga zbog kojeg su bili na zlu glasu - ako su dovoljno dugo radili, potrosili bi svu raspolozivu memoriju.

 

Kako sad ispraviti taj primjer? Pa, ovako:

 

    cout << "Unosi starost pasa, jednog po jednog (-1 za kraj unosa):\n";

    int starostTrenutnog;
  
    do {  
       cin >> starostTrenutnog;
        
       if (starostTrenutnog >= 0) {
          dog *noviPas = new dog(starostTrenutnog);
           if (listaPasa == 0) { listaPasa = noviPas; trenutniPas = noviPas; }
           else {
             trenutniPas->sljedeciDog = noviPas;
             trenutniPas = noviPas;
           }
       }

    } while (starostTrenutnog >= 0);

Kreiranje objekta premjestimo unutar bloka koji se izvrsava samo ako je zadovoljen uvjet starostTrenutnog >= 0.

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

 

Inace, situacija na ovoj temi podsjeca me na jednu raspravu s tipom koji je radio rekurziju, a da pritom uopce nije koristio vrijednost funkcij koju je rekurzivno pozvao! Evo njegov izvorni kod:

int euklid_alg(int a, int b){
    /*euklidov algoritam pomocu rekurzivne funkcije (funkcija koja poziva sama sebe*/
    int mod=a%b;
    if (mod==0)
       return b;
    a=b;
    b=mod;
    euklid_alg(a,b);
}//euklid

 

Jest ga zakomplicirao,

 

 

int euklid_alg(int a, int b){

   /*euklidov algoritam pomocu rekurzivne funkcije (funkcija koja poziva sama sebe*/

   if(b==0)

return a;

else

return euklid_alg(b, a%b);

}//euklid

 

 

Poruka je uređivana zadnji put uto 24.8.2010 16:08 (Floki).
14 godina
neaktivan
offline
C++ - brza pitanja iz objektno orij. programiranja

Dog mydogs[10000]?

 

 

Sta nije to array objekata klase mydogs...netko je rekao da je to vektor =0

optimizam je nedostatak informacija
Moj PC  
0 0 hvala 0
17 godina
moderator
online
RE: C++ - brza pitanja iz objektno orij. programir
Pijavica kaže...

Dog mydogs[10000]?

 

 

Sta nije to array objekata klase mydogs...netko je rekao da je to vektor =0

array = polje (u ovom slucaju ne govorimo koliko dimenzija ima polje)

vektor = jednodimenzionalno polje - array []

matrica = dvodimenzionalno polje - array [][]

 

Znaci, rijecju vektor ili matrica samo preciziramo o kakvoj vrsti polja (arraya) se radi, odnosno koliko dimenzija ima to polje.

 

 

Treba napomenuti da, iako se termin vektor nekad koristi kao drugi naziv za jednodimenzionalno polje (kao sto smo ga mi tu koristili), C++ zapravo ima posebnu klasu vector (ili preciznije predlozak klase) koja je ekvivalentna jednodimenzionalnom polju, ali ima metode za umetanje, dodavanje, brisanje (i jos neke druge) pojedinih elemenata vektora. Znaci, koristenjem tog predloska klase zapravo dobijemo dinamicku "strukturu", dinamicko jednodimenzionalno polje. Vise o tome imas ovdje. Java ima slicnu klasu Vector.

17 godina
offline
C++ - brza pitanja iz objektno orij. programiranja

MBaksa, nemoj razljutiti čovjeka, forum bi dosta izbubio kad bi se on povukao

zašto samo ja nemam dojam da mu "čerećiš" kod liniju po liniju, nego vidim da i drugi misle tako

 
3 0 hvala 0
17 godina
moderator
online
RE: C++ - brza pitanja iz objektno orij. programir
Floki kaže...

MBaksa, nemoj razljutiti čovjeka, forum bi dosta izbubio kad bi se on povukao

zašto samo ja nemam dojam da mu "čerećiš" kod liniju po liniju, nego vidim da i drugi misle tako

Jesam li ja ISTA kritizirao njegov zadnji primjer? Ne samo da ga nisam kritizirao, nego sam se u svojoj poruci nastavio na njega. Zato jer je dobar, zato jer dobro pokazuje kad i kako se kreiraju i unistavaju objekti, ovisno o tome jesu li stvoreni staticki ili dinamicki.

Komentar o "razljucivanju" vise govori o tome kakvim covjekom ti Tracera smatras i u to se ne bih mijesao. A to da necu kritizirati pogresno ili lose napisan kod ili (dez)informacije - to ne mozes ocekivati. Ocito ovdje nije problem u kritiziranju, nego o prihvacanju kritike - pogledaj recimo ovu temu (http://www.bug.hr/forum/topic/programiranje/uvod-programiranje/65126.aspx) - seciranje linije po linije koda i nema nikakvih problema, jer je covjek prihvatio kritiku i ispravio ono sto sam kritizirao. I nema filozofa koji sve to nadgledaju i nekonstruktivno filozofiraju o tome bi li nesto trebalo kritizirati ili ne, umjesto da sami daju koristan doprinos temi. Stoga preporucam manje nekonstruktivnog filozofiranja, a vise korisnog rada.

 

Poruka je uređivana zadnji put čet 26.8.2010 15:16 (mbaksa).
17 godina
protjeran
offline
C++ - brza pitanja iz objektno orij. programiranja

Nema to uopće veze s prihvaćanjem kritika već tvojim namjernim provokacijama, gdje se kačiš na sitnice kako bi nekoga (zapravo, sve redom) pravio idiotom i na račun toga sebe reklamirao. A koliko čujem to uopće nije slučaj samo na ovom podforumu nego se ti svugdje i u svakoj temi smatraš najpametnijim. Zapravo, ova tvoja izjava mi je sve rekla:

 

mbaksa kaže...
Nemoj molim te pokusavati pokazivati da znas vise od mene.

 

I to je ono što je zapravo tvoj problem. Ne if naredba, ne statički i dinamički objekti i sitnice na koje se kačiš, već ego i bahatost. Pa ako je tako neka ti i bude. Ne kanim uopće u tome sudjelovati. Stoga, još danas sam zatražio crni karton pa me više neće biti na ovom forumu tako da se više ne moraš osjećati ugroženo i u obrani pljuvati po drugima (bar ne po meni).

 

A ostalima samo želim reći da mi je bilo drago dok je trajalo Namigiva. Ovo nije jedini forum na kojemu sam prisutan, a ako me trebate možete se javiti i na

 

http://programiranje.big-forum.net/ privatnom porukom.

 

Pozdrav svima Osmijeh

Moj PC  
4 0 hvala 0
17 godina
offline
RE: C++ - brza pitanja iz objektno orij. programir
Tracer kaže...

Nema to uopće veze s prihvaćanjem kritika već tvojim namjernim provokacijama, gdje se kačiš na sitnice kako bi nekoga (zapravo, sve redom) pravio idiotom i na račun toga sebe reklamirao. A koliko čujem to uopće nije slučaj samo na ovom podforumu nego se ti svugdje i u svakoj temi smatraš najpametnijim. Zapravo, ova tvoja izjava mi je sve rekla:

 

mbaksa kaže...
Nemoj molim te pokusavati pokazivati da znas vise od mene.

 

I to je ono što je zapravo tvoj problem. Ne if naredba, ne statički i dinamički objekti i sitnice na koje se kačiš, već ego i bahatost. Pa ako je tako neka ti i bude. Ne kanim uopće u tome sudjelovati. Stoga, još danas sam zatražio crni karton pa me više neće biti na ovom forumu tako da se više ne moraš osjećati ugroženo i u obrani pljuvati po drugima (bar ne po meni).

 

A ostalima samo želim reći da mi je bilo drago dok je trajalo Namigiva. Ovo nije jedini forum na kojemu sam prisutan, a ako me trebate možete se javiti i na

 

http://programiranje.big-forum.net/ privatnom porukom.

 

Pozdrav svima Osmijeh

Tracer

Ako te mogu zamoliti u ime svih nas sa foruma: OSTANI

neka on ide, ti si nam koristan

Poruka je uređivana zadnji put čet 26.8.2010 16:38 (Floki).
17 godina
moderator
online
RE: C++ - brza pitanja iz objektno orij. programir
Tracer kaže...
I to je ono što je zapravo tvoj problem. Ne if naredba, ne statički i dinamički objekti i sitnice na koje se kačiš, već ego i bahatost.

Eto, sad vidis sto se desi kad se nadju dva takva i ni jedan ne popusta. Namigiva

 

Tracer kaže...
Pa ako je tako neka ti i bude. Ne kanim uopće u tome sudjelovati. Stoga, još danas sam zatražio crni karton pa me više neće biti na ovom forumu tako da se više ne moraš osjećati ugroženo i u obrani pljuvati po drugima (bar ne po meni).

Svaki izgovor je zlata vrijedan. Ne moras zbog mene napustati forum. Zao mi je ako sam pretjerao - perfekcionist sam i isto ocekujem (inzistiram) od drugih, pogotovo kad se radi o edukaciji - preciznu i tocnu informaciju smatram svetinjom. Tim vise sto je u ovo doba lako doci do takvih informacija. Smatram da covjek koji ovdje postavi pitanje ima pravo na to - pa pogotovo su u programiranju stvari prilicno jasne - nije to ko kad obradjujes sliku pa pital da li da posvijetlis sliku 5 ili 10%.

 

Izbjegavat cu komentirati tvoje poruke koliko god je to moguce. Vec sam zapravo to i poceo - zadnjih par poruka si ti inicirao "ispravljajuci" mene. No, eto - velim - zbog mene ne moras napustiti forum.

14 godina
neaktivan
offline
C++ - brza pitanja iz objektno orij. programiranja

#include <iostream>

#include <iomanip>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <stdio.h>

 

using namespace std;

 

class drvo{

public:

drvo();

~drvo();

 

void setduljina(int n);

int getduljina();

void setime(string s);

string getime();

int duljina;

 

private:

 

string ime;

 

};

 

 

drvo::drvo(){}

drvo::~drvo(){}

void drvo :: setduljina(int n){duljina = n;}

void drvo :: setime(string s){ ime = s; }

 

int drvo :: getduljina(){return duljina;}

string drvo :: getime(){ return ime; }

 

 

bool cmp(const drvo &x,const drvo &y){return x.duljina<y.duljina;}

 

 

 

 

int main(){

 

 

int c;

cout<<"Broj Stabala U vrtu?"<<endl;

cin>>c;

 

drvo stab[c];

string s;

int a;

cout<<"Upisite duljinu,a zatim i ime svakog stabla"<<endl;

for(int i=0;i<c;i++)

{

 

cin>>a>>s;

stab[i].setduljina(a);

stab[i].setime(s);

}

 

 

sort(stab,stab+c,cmp);

 

 

cout<<endl<<"Poredak"<<endl;

for(int i=0;i<c;i++)

{

cout<<i<<". "<<stab[i].getime()<<endl;}

 

 

 

 

system("PAUSE");

return 0;

}

 

 

Ovo je kod kojim sam rješavao zadatak sortiranja stabala po veličini...Sad me zanima bi li postojao lakši način za njegovo rješavanje?

I još kod bool funkcije Duljinu sam morao staviti da bi program radio =/,zanima me da li se to može izbjeći?

 

optimizam je nedostatak informacija
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
C++ - brza pitanja iz objektno orij. programiranja

mbaksa je u pravu, svaki primjer mora bitiispravno napisan cijeli, ne samo dio koji je kao bitan.

a za tvoje pitanje:

jesi ti probao to kompajlirati. Pretp da

drvo[c] nece raditi. Jer c mora biti poznati broj kod kompajliranja.

 
1 0 hvala 0
17 godina
moderator
online
RE: C++ - brza pitanja iz objektno orij. programir
Zoidberg kaže...

jesi ti probao to kompajlirati. Pretp da

drvo[c] nece raditi. Jer c mora biti poznati broj kod kompajliranja.

Hm... Isto sam si i ja mislio i... Neces vjerovati, ali kompajlirano i - radi. Pod Dev-C++-om. Mozda neki kompajleri imaju neku optimizaciju vezanu uz to pa sami stavljaju na heap olaksavajuci programeru... Ne znam. Mada, ja bih to rucno napravio po propisu - s operatorom new.

 

Edit: Nasao sam informaciju zasto to radi (na nekim kompajlerima): FYI, that statement is illegal C++, the only reason it works in g++ is because they are too lazy to remove that feature (it is valid C99 code).

 

Pijavica kaže...
Ovo je kod kojim sam rješavao zadatak sortiranja stabala po veličini...Sad me zanima bi li postojao lakši način za njegovo rješavanje?

U kom smislu laksi? Svaki od koraka koje si napravio - moras napraviti - moras unijeti podatke u objekte, moras pozvati funkciju sort. Jos je super stvar sto ni ne moras sam raditi algoritam za sortiranje. Namigiva

 

Pijavica kaže...

I još kod bool funkcije Duljinu sam morao staviti da bi program radio =/,zanima me da li se to može izbjeći?

Mislis na ovo?

bool cmp(const drvo &x,const drvo &y){return x.duljina<y.duljina;}

 

Kako to mislis "morao"? Smisao te funkcije je odredjivanje kriterija sortiranja. Ako si zelio sortirati po duljini, onda normalno da ces usporedjivati duljinu. Ako si mislio sortirati po imenu, onda normalno da ces umjesto duljine koristiti ime (samo sto stringove ne bi usporedjivao na taj nacin, nego pomocu metode compare).

 


BTW kako si uspio dobiti sve te horizontalne linije u kodu? Ako si to dobio obicnim copy&pasteanjem iz nekog programerskog editora, probaj to prvo iskopirati u Notepad pa onda na forum - ovako je tesko citljivo, i kad se copy&pastea u editor, dupli su razmaci. A jos si i ovako stavio hrpu suvisnih razmaka. Takodjer, pazi na hijerarhiju - ono sto je hijerarhijski na nizoj razini (unutar bloka naredbi, dakle unutar { i } ), to mora biti malo uvuceno.

 

Poruka je uređivana zadnji put pet 27.8.2010 3:39 (mbaksa).
14 godina
neaktivan
offline
C++ - brza pitanja iz objektno orij. programiranja

Možeš stavit taj kod "po propisu" s operatorom new,zanima me kako bi se tako napisao.

optimizam je nedostatak informacija
Moj PC  
0 0 hvala 0
17 godina
moderator
online
RE: C++ - brza pitanja iz objektno orij. programir

Cini se da je dovoljno polje deklarirati i inicijalizirati na ovaj nacin:

 

drvo *stab = new drvo[c];

 

 

Naravno, kad ti polje vise ne treba (u ovom slucaju na kraju programa), onda ga obrises naredbom:

 

delete stab;

Poruka je uređivana zadnji put pet 27.8.2010 14:35 (mbaksa).
17 godina
neaktivan
offline
C++ - brza pitanja iz objektno orij. programiranja

Ne znam jel to prikladno za ucenje, al ja bih odmah poceo korisititi template vektor. Kad se prode par primjera mislim da je svakom jasno kak napraviti osnovne stvari sa njim(dodavanje elementata, brisanje svih elementata,...)

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