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

pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija

[es] :: C/C++ programiranje :: C/C++ za početnike :: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija

Strane: 1 2

[ Pregleda: 4661 | Odgovora: 33 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp320.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 23:20 - pre 199 meseci
Meni je samo problem da skontam zasto onda ta funkcija/operator (whatever) mora biti friend, kada i ne mora :) Mislim, ne sumnjam da razlog postoji, samo ga ja jos ne vidim. Ako za sva 3 friend clana :

Code:

class Bin
{
 .
 .
 .
 friend int count(const Bin& toCount);
 friend ostream& operator << (ostream& theStream, Bin& binary);
 friend istream& operator >> (istream& theStream, Bin& binary);
};

// implementacije gornjih clanova


postavimo komentare:
Code:

class Bin
{
 .
 .
 .
 //friend int count(const Bin& toCount);
 //friend ostream& operator << (ostream& theStream, Bin& binary);
 //friend istream& operator >> (istream& theStream, Bin& binary);
};

// implementacije gornjih clanova


program radi! Ja sam mislio da sa friend omogucavamo funkcijama da pristupe odredjenim podacima klase, tj. kao da su i pripadnice te klase, ali kada pokusam iz bilo koje ove funkcije pristupiti npr. binarni_broj, izbaci mi error. Ne mogu pristupiti nicemu, niti varijablama niti metodama... Sad se pitam za sta uopste sluzi ovo friend (u ovome zadatku). Ne vidim neophodnost primjene friend kada sve radi i bez toga. Mozda je stvar ovdje u nekakvom manipulacjiom memorijom? Da se ove funkcije uklope nekako u ove objekte? Iskreno, ne znam... Znam da cu pogledati malo, jer bezveze samo postavljam pitanja a nisam niti pogledao neke osnovne primjere tako da se ne trudite objasniti, iako jako zahvaljujem na pomoci. Ako nadjes Bojane nesto korisno, postali ovdje, i ja cu uraditi isto kad se naspavam :)) Pozdrav!

EDIT: Naravno, pomocu drugog argumenta (Bin &) operatorima proslijedjujemo sve potrebne informacije da bi obavili posao kako treba, zasto ce nam onda friend?
 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija24.12.2007. u 21:29 - pre 198 meseci
Imam pitanje u vezi rješenja, imali potrebe za četiri konsturktora ili je se to moglo rješiti preko jednog?

A što se tiče funkcije

Code:
void   setBinarniBroj(string set)       { binarni_broj = set; }


primjetio sam ako je uneseni broj manji od dim, npr.

ako je dim=5, a unesemo 0011 ili 001,
prilikom ispisivanja dobit ćemo:
0011 i 001
a ne
00011 i 00001,
kako je prikazano u zadatku;

Znam da se na prvi način štedi memorija, ali radi učenja kako da dodam te nule na početak?
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp320.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija24.12.2007. u 21:57 - pre 198 meseci
Eh, ovako... Sto se tice konstruktora, odgovor je i da i ne. Od 4 konstruktora prvi je prazan konstruktor (podrazumjevano kreira bin 0), drugi se koristi za cast iz int u Bin, kao i za kreiranje samo nekog Bin broja bez dim vrijednosti (default dim = 4). Treci, najvazniji, je tipicni konstruktor kreacije Bin objekata. Cetvrti, copy konstruktor, se ovdje uopste ne treba implementirati, jer bi compiler sam napravio odgovarajuci shallow-copy copy konstruktor jer se u objektu ne koriste pointeri. E sada, da li su sva 4 potrebna? 4. nije. Prvi se moze rijesiti tako da stavimo u 3. default vrijednosti argumenata (u slucaju da se pozove prazan konstruktor) itd... Ipak, zasto onda postoje 4? Zato da se ("eventualna") kasnija nadopunjavanja koda lakse izvrse. Treba znati gdje je sta, da se kasnije lako moze nadograditi kod. Sa pristupom default argumenata samo cemo kasnije zakomplicirati sve.
Sto se tice ostatka, kao sto sam vec napisao negdje prije, program pati od ozbiljnog nedostatka sa ovim dim-ovima. Dati metod setBinarniBroj(string) se samo oslanja na to. Procitaj prethodne postove. Zasto bi on trebao mjenjati dim ako je dim nepromjenjiv u zadatku? Ako bi ti trebalo da neki uneseni broj kao 101 zbog dim 5 spremis u 00101, onda jednostavno unutar setBinarniBroj(string) moras dodatno provjeriti da li je broj koji unosis <= dim objekta. Broj spremis u binarni_broj, ostatak popunis nulama. Nesto slicno imas u metodi setBinarniBroj(int set)... Javi ako zapne, pozdrav!
 
Odgovor na temu

k.bojan

Član broj: 158850
Poruke: 28
*.broadband.blic.net.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija25.12.2007. u 13:47 - pre 198 meseci
Za Sephiroth?-a:

Evo mali isjecak iz jedne knjige o friend funkcijama:

Razmotrimo definicije preopterecenih operatora jedanosti za klasu String koji su definisani u oblasti vazenja prostora imena. Operator jednakosti za dva objekta klase string je:
Code:

bool operator==(const String &str1, const String str2)
{
   if( str1.size() != str2.size() )
       return false;
   return strcmp( str1.c_str(), str2.c_str() ) ? false : true;
}


Uporedite ovu definiciju sa definicijom istog operatora kada je on definisan kao funkcija clanica:
Code:

bool String::operator==(const String &rhs ) const
{
   if( _size != rhs.size() )
       return false;
   return strcmp( _string, shs._string ) ? false : true;
}

Da li vidite razliku? Uocite da smo u ovoj definiciji morali da promenimo nacin na koji se koriste privatni podaci clanovi klase String. Posto je novi operator jednakosti globalna funkcija, a ne funkcija clanica klase, on ne moze da direktno koristi privatne podatke clanove klase String. Zbog toga, za dobijanje velicine objekta klase String i njemu odgovarajuce niske znakova u stilu jezika C, on koristi pristupne funkcije clanice size() i c_str();
Drugo moguce resenje je da se ovi globalni operatori jednakosti deklarisu kao prijatelji klase String. Ako neka klasa deklarise funkciju ili operator kao prijatelje, ona toj funkciji ili operatoru daje pravo pristupa do svojih nejavnih clanova.
Deklaracija prijatelja pocinje kljucnom reci friend. Ona moze da se nalazi samo unutar definicije klase. Posto prijatelji nisu clanovi klase koja proglasava prijateljstvo, na njih ne utice to da li su unutar tela klase deklarisani u javnoj, privatnoj ili zasticenoj sekciji. U sledecem primeru izabrali smo da sve deklaracije prijatelja grupisemo odmah posle zaglavlja klase:
Code:

class String{
   friend bool operator==(const String &, const String &);
   friend bool operator==(const char *, const char *);
   friend bool operator==(const String &, const char *);
public:
   //...ostatak klase String
};

Ove tri deklaracije prijatelja u klasi String deklarisu tri preopterecena operatora poredjenja koja su deklarisana u globalnoj oblasti vazenja kao prijatelji klase String.
Sada posto su operatori jednakosti deklarisani kao prijatelji, njihova definicija moze da direktno koristi privatne clanove klse String:
Code:

// operatori koji su prijatelji: mogu da direktno koriste privatne clanove klse String
bool operator==(const String &str1, const String &str2)
{
   if( str1._size() != str2._size() )
       return false;
   return strcmp( str1._string(), str2._string() ) ? false : true;
}

inline bool operator==(const String &str1, const char *s)
{
   return strcmp( str._string, s ) ? false : true;
}

Neko moze sa pravom da tvrdi da, u ovom slucaju, direktan pristup clanovima _size i _string nije neophodan, posto funkcije size() i c_str(), kao umetnute, daju jednaku efikasnost, a u isto vrijeme obezbedjuju i enkapsulaciju podataka clanova. Koriscenje pristupnih funkcija umjesto direktnog pristupa clanovima ne znaci uvjek i manje efikasnu imeplementaciju. Zbog ovih pristupnih funkcija nema potrebe da deklariseno operatore jednakosti kao funkcije prijaljtelje klase String.
Kako se onda odlucujemo da li neki operator koji nije clan klase treba da bude proglasen prijteljem ili in treba da koristi pristupne funkcije clanice? U opstem slucaju dizajner klase treba da tezi da minimizuje broj globalnih funkcija i operatora koji imaju pristup do interne reprezentacije klase. Ako postoje funkcije za pristup clanovima koje su jednako efikasne, onda je bolje da se one koriste i time izoluju globalni operatori od promjena u reprezentaciji klase, bas kao sto se to radi sa drugim funkcijama prostora imena. Ako za neke privatne clanove klase ne postoje odgovarajuce pristupne funkcije u lasi, i ako globalni operatori za obavljanje svojih funkcija moraju da koriste te privatne clanove, onda koriscenjem mehanizma prijatelja postaje neophodno.
Najcesca primjena mehanizma prijatelja je da se preopterecenom operatoru koji nije clan klase dozvoli pristup do privatnih clanova te klase ciji je on prijatelj. Razlog za ovo, pored potrebe da se omoguci simetrija koriscenja levog i desnog operanda, jeste sto bi preopterecen operator i inace morao da bude funkcija sa punim pristupom do privatnih clanova klase.
Mada je dominantna primjena mehanizma prijatelja ona za preopterecene operatore, postoje slucajevi kada funkcija prostora imena, funkcija clanica neke druge prethodno definisane klase ili citava klasa moraju da se deklarisu kao prijatelji. Kada se jedna klasa proglasava prijateljem druge, funkcije clanice klasa prijatelja dobijaju pristup do nejavnih clanova klase koja proglasava prijateljstvo. Sada cemo deteljnije razmotriti deklaracije prijatelja za funkcije koje nisu operatori.
Klasa mora da deklarise kao prijatelja svaku funkciju iz skupa preopterecenih funkcija koje zeli da ucini prijateljima. Na primjer:
Code:

extern ostream& storeOn( ostream &, Screen & );
extern BitMap& storeOn( BitMap &, Screen & );
//...

class Screen {
   extern ostream& storeOn( ostream &, Screen & );
   extern BitMap& storeOn( BitMap &, Screen & );
   //...
};


Ako funkcija manipulise objektima dvije razlicite klase i potreban joj je pristup do nejavnih clanova obe klase, ta funkcija moze bilo da se deklarise obe klase, bilo da se ucini funkcijom clanicom jedne a prijateljem druge...
Primjer:
Ako odlucimo da funkcija mora da bude prijatelj obe klase, ove deklaracije prijateljstva izgledaju kao na primjer:
Code:

class Window;//samo deklaracija
class Screen {
   friend bool is_equal ( Screen &, Window & );
   /...
};

class Window {
   friend bool is_equal ( Screen &, Window & );
   /...
};

Ako odlucimo da funkcija mora da bude clanica jedne klase a prijatelj druge klase, deklaracija funkcije clanice i deklaracija prijatelja su na primjer:
Code:

class Window;
class Screen {
   public:
   // copy je funkcija clanica klase Screen
   Screen& copy ( Window & );
   //...
};

class Window {
   // Screen::copy je prijatelj klase Window
   friend Screen& Screen::copy( Window & );
   // ...
};

Screen& Screen::copy( Window & ) { /* ... */ }

Funkcija clanica neke klase ne moze da se deklarise kao prijatelj druge klase pre definicije ove prve klase. ovo se ne moze uvjek postici. Na primjer, sta ako klasa Screen mora kao prijatelje da deklarise funkcije clanice klase Window, a klasa Window isto mora kao prijatelje da deklarise funkcije clanice klase Screen? U ovom slucaju, citava klasa Window moze da se deklarise kao prijatelj klase Screen. Na primjer:
Code:

class Window;
class Screen {
   friend class Window;
   /...
};

Svaka funkcija clanica klase Window sada ima pristup svim ne javnim clanovima klase Screen;




Nadam se da sam pomogao, i da ces uspjeti da shvatis svrhu friend. Ako nesto jos treba javi...
Pozdrav
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp13.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija25.12.2007. u 21:45 - pre 198 meseci
Kako je ovo meni smjesno sada :)) Hvala PUNO na ovome, ali kad nekome nesto ne ide u glavu... Shvatio sam, kljucni dio:

Code:

// razlika izmedju

str1._string

// i

str.getString()


joj... Ja sam izgleda bio shvatio poentu friend, ali sam napravio ogromnu pogresnu pretpostavku! Ja cijelo vrijeme kontam da se funkcije napravljene sa friend ukljucuju ravnopravno medju ostale public metode klase. Mislio sam da uopste ne trebamo proslijedjivati objekat friend funkciji, jer naravno (po mojoj bivsoj logici) funkcija ima pristup njemu zato sto je U NJEMU, ali pa naravno nije... U cemu bi inace i bio smisao, pa friend samo omogucuje da vidimo privatne dijelove proslijedjenog objekta! Uh! Nemam pojma zasto sam ovako to pogresno zakljucio, :(. Hvala ti na ovome, trebalo mi je samo da vidim par primjera, iako sam mislio to veceras preci temeljno, ustedio si mi truda, ovako samo nastavljam dalje. Moram naravno pogledati jos oko toga svega... Malo offtopic, ali zanimljivo je da je Java potpuno izbacila friend princip zbog narusavanja koncepta "sakrivanja informacija". Iskreno, i ne vidim velik znacaj ovog friend koncepta, ali naravno on negdje postoji (pretpostavljam radi performansi), pa je i zato i ukljucen u C++... Ko nece da ga koristi i ne mora! Pozdrav!

P.S promijenicu kod iz zadatka, sada kontam da su friend metode pogresno napravljene! Prikacicu sutra...
 
Odgovor na temu

k.bojan

Član broj: 158850
Poruke: 28
*.broadband.blic.net.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija25.12.2007. u 22:40 - pre 198 meseci
Drago mi je da sam pomogao...
A sto se tice jave...tako nesto nam je profesor na predavanjima pricao...ja licno javu ne volim...ne znam zasto...mozda zasto sto su svi sa kojima sam pricao o njoj rekli nesto tipa "ma java je losa" puna bagova...a i uvjerio sam se da je spora...Tako da sto se tice programiranja C,C++,C# meni za sada tri omiljena jezika...
Pozdrav
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-67.bvcom.net.



+1064 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija25.12.2007. u 22:45 - pre 198 meseci
Pogledaj klasu bitset iz headera <bitset>. Cini mi se da tamo ima sve sto ti treba.
Sa malo gimnastike mozes izvesti tu tvoju klasu maltene bez ikakvog kodiranja cini mi se
(nema samo 2. komplement).
Zadatak nije bas najjasnije definisan sa obzirom da konverzija u int podrazumeva
da ti dim ne predje odredjenu vrednost (31).
Sta ako je binarni broj veci od toga? Ili ovo podrazumeva da dim bude max 31?
U tom slucaju klasu mozes predstaviti bas sa jednim int-om.

Pozzzzzzzzzzzz!
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp509.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija25.12.2007. u 23:10 - pre 198 meseci
@ bojan:

Nije Java losa, ali naravno nije niti za poredjene sa C++-om. Java je po meni samo Internetski jezik, iako se za mnogo toga jos moze koristiti, ali tu svrhu najbolje oponasa, dok se C++ moze koristiti za sve, zato jeste i najobuhvatniji i sa najvise opcija, iako je naravno uvijek brze koristiti jezik namjenjen za neko podrucje... C# ~= Java.

Citat:
"ma java je losa" puna bagova
to je ipak malo i vise nego pretjerano
 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija25.12.2007. u 23:12 - pre 198 meseci
Opet ja, probao sam nesto napraviti i to izgleda ovako:

Code:
 int cBin::set_number(string input) 
{
     
     int len = input.length();
     
     if (len > dim) 
     {
             //Error;
             return 0;
     }
     else 
     {
      string temp;
      
      for (int i=0; i<(dim-len); i++)
          temp += '0';
      
      number = (temp+input);
      return 1;
     }


// dim i number su atributi klase cBin, dim je int, a number je string;
// dok je set_number member funkcija klase cBin;

Pitanje, da li se ovo može rešiti na jednostavniji način?
pod jednostavnijim mislim elegantnijim načinom.

// ovo je vezano za ono pitanje kada unesem 011 da mi ispiše 00011, u zavisnosti od dim;
 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija25.12.2007. u 23:12 - pre 198 meseci
Opet ja, probao sam nesto napraviti i to izgleda ovako:

Code:
 int cBin::set_number(string input) 
{
     
     int len = input.length();
     
     if (len > dim) 
     {
             //Error;
             return 0;
     }
     else 
     {
      string temp;
      
      for (int i=0; i<(dim-len); i++)
          temp += '0';
      
      number = (temp+input);
      return 1;
     }


// dim i number su atributi klase cBin, dim je int, a number je string;
// dok je set_number member funkcija klase cBin;

Pitanje, da li se ovo može rešiti na jednostavniji način?
pod jednostavnijim mislim elegantnijim načinom.

// ovo je vezano za ono pitanje kada unesem 011 da mi ispiše 00011, u zavisnosti od dim;
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp466.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija26.12.2007. u 20:47 - pre 198 meseci
Evo ovako… Ovo je veoma malena metoda, stoga neces puno dobiti na ukupnim performansama cijelog programa da je ubrzas i za 200%. Da radis 10 puta veci program, i da pozivas ovu metodu konstatntno, onda bi to vec bilo nesto. Elegantno rjesenje ne znaci nuzno i najefikasnije. Prost primjer toga ti je rekurzija, iako veoma elegantna, u 95% slucajeva je inferiorna svim ostalim tehnikama kada se radi o istom problemu.
Ucenja radi, evo malo da rasclanimo:

Code:


int cBin::set_number(string input)

/* funkcija ti ne bi trebala za uspjeh ili neuspjeh zadatka vracati jedinice ili nule. To ti je zastarjela tehnika,
iako korisna naravno, ali citljivije ti je ta kao povratnu vrijednost stavis bool, te koristis true i false.
Btw, ovo ti smanjuje velicinu povratne vrijednosti sa 4 byta na 1 byte, ako cemo bas sve gledati.
Ime funkcije ti je lose odabrano, po nekakvoj nepisanoj konvenciji, imena metoda se pisu sa pocetnim malim
slovom, te sa velikim slovom za svaku slijedecu rijec, npr. nekaMetodaKojaNistaNeRadi(), tj setNumber().
set_number bi bolje vazio za neku prostu varijablu kojoj bi trebao takav naziv. */

 {
     //Za slijedece linije koda postoji “elegantnije” rjesenje 
     int len = input.length();
     
     if (len > dim) 
     {
             //Error;
             return 0;      // return true;
     }
     else 
     {
      string temp; 
      
      for (int i=0; i<(dim-len); i++)
          temp += '0';
      
      number = (temp+input);
      return 1;
     }
 } 



Evo nesto drugacije rjesenje:

Code:


bool cBin::set_number(string input) 
 {
  if (input.length() > dim) 
   {
    //Error;
    return false;
   }
  else 
   {
    number = "";
          
    for (int i=0; i < (dim - input.length()); ++i)
     number += '0';
    number.append(input);
    return true;
   }
 }



Objasnjenje: postavis number da je prazan, dodas koliko nula treba, na ostatak nadovezes input pomocu append. Ovo rjesenje nije nista drugacije u konceptu od tvoga, ali sada nemas vise 2 pomocne varijable. append() je najbrze moguce rjesenje za dodavanje stringa, koristim ga samo zato sto sam izbacio jednu dodatnu temp varijablu koja ti je trebala.

Ovaj moj odgovor je samo odgovor na tvoje pitanje, da li postoji drugacije rjesenje. Tvojoj metodi apsolutno nista ne fali. Drugo rjesenje uvijek postoji, i ne mora nuzno biti bolje. Budi siguran u svoj kod, kada ga napises, uvijek se zapitaj cime ga mozes unaprijediti, tako najbolje ucis...
 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija27.12.2007. u 16:49 - pre 198 meseci
Ok, puno hvala!!
Pozdrav.
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp232.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija28.12.2007. u 18:54 - pre 198 meseci
Evo samo code koji sam obecao, kompletna klasa Bin, naravno jos uvijek pati od dim nedostatka (pogledaj gornje postove), ali sada su friend funkcije onakve kakve bi i trebale biti...
Prikačeni fajlovi
 
Odgovor na temu

icobh
Igor Pejašinović
Network Admin
Navigo SC d.o.o.
Banja Luka

Član broj: 18738
Poruke: 1319
*.inecco.net.

Sajt: www.nsc.ba


+4 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija28.12.2007. u 19:34 - pre 198 meseci
Ja 78 bodova na ovom kolokviju. Dosta brate, kakve sam sve gluposti pisao. Još će Brđo da kaže: "Kolega, da je ovo moj kôd, ja bih odmah skočio sa gradskog mosta!"
I ♥ ♀

Ovaj post je zlata vrijedan!
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija

Strane: 1 2

[ Pregleda: 4661 | Odgovora: 33 ] > FB > Twit

Postavi temu Odgovori

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