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

Lokalna kopija!

[es] :: C/C++ programiranje :: Lokalna kopija!

Strane: 1 2 3

[ Pregleda: 7770 | Odgovora: 40 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon Lokalna kopija!22.08.2003. u 15:50 - pre 250 meseci

Sledeci program radi OK, ali bih ipak imao par pitanja.


Code:


// Sve sto jednom gradjaninu moze zatrebati
// vezano za pravougaonik

# include <iostream.h>
# include <conio.h>

typedef unsigned short int USHORT;
typedef unsigned long int ULONG;
enum BOOL {FALSE, TRUE};
enum CHOICE {DrawRect = 1, GetArea,
             GetPerim, ChangeDimensions, Quit};

//Deklaracija klase pravougaonik

class Rectangle
{
    public:
       //konstruktori
       Rectangle (USHORT width, USHORT height);
       ~Rectangle();

       //metode pristupa
       USHORT GetHeight() const {return itsHeight;}
       USHORT GetWidht() const {return itsWidht;}
       ULONG GetArea() const {return itsHeight * itsWidht;}
       ULONG GetPerim() const {return 2*itsHeight + 2*itsWidht;}
       void SetSize(USHORT newWidht, USHORT newHeight);

       //Razne metode (koje se ovde ne koriste)
       void DrawShape()const;

    private:
        USHORT itsWidht;
        USHORT itsHeight;
};                          //kraj deklaracije klase


//Implementacija metoda klase

void Rectangle::SetSize(USHORT newWidht, USHORT newHeight)
{
    itsWidht = newWidht;
    itsHeight = newHeight;
}

Rectangle::Rectangle(USHORT widht, USHORT height)
{
    itsWidht = widht;
    itsHeight = height;
}

Rectangle::~Rectangle() {}

//deklaracija f-ja NECLANICA

USHORT DoMenu();
void DoDrawRect(Rectangle);
void DoGetArea(Rectangle);
void DoGetPerim(Rectangle);


void main()
{
      //inicijalizuje pravougaonik na 30, 5
      Rectangle theRect(30,5);

      USHORT choice = DrawRect;
      USHORT fQuit = FALSE;

      while (!fQuit)
      {
          choice = DoMenu();
          if (choice < DrawRect || choice > Quit )
          {
              cout << "\n Nevazeci izbor, molim Vas pokusajte ponovo.\n\n";
              continue;
          }
          switch (choice)
          {
          case DrawRect:
             DoDrawRect(theRect);
             break;
          case GetArea:
             DoGetArea(theRect);
             break;
          case GetPerim:
             DoGetPerim(theRect);
             break;
          case ChangeDimensions:
             USHORT newLenght, newWidht;
             cout << "\n Nova sirina: ";
             cin >> newWidht;
             cout << " \n Nova visina: " ;
             cin >> newLenght;
             theRect.SetSize(newWidht, newLenght);  

             DoDrawRect(theRect);        //opciono
             break;
          case Quit:
             fQuit = TRUE;
             cout << "\nIzlazak....\n\n";
             break;
          default:
             cout << "Greska u izboru!\n";        //ne vidim kako ikada  
             fQuit = TRUE;
             break;
          }                // kraj switch
      }             // kraj while
getch();
}            // kraj main


// Definicija f-ja NECLANICA

USHORT DoMenu()
{
   USHORT choice;
     cout << "\n\n ***Meni***\n";
     cout << "(1) Nacrtaj pravougaonik\n";
     cout << "(2) Izracunaj povrsinu\n";
     cout << "(3) Izracunaj obim\n";
     cout << "(4) Promeni velicinu\n";
     cout << "(5) Izlaz\n";
   cin >> choice;
   return choice;
}

void DoDrawRect(Rectangle theRect)
{
   USHORT height = theRect.GetHeight();
   USHORT widht = theRect.GetWidht();
   cout << "\n";
   for (USHORT i=0; i<height; i++)
   {
       for (USHORT j=0; j<widht; j++)
          cout << "*";
       cout << "\n";
   }
}


void DoGetArea(Rectangle theRect)
{
    cout << "Povrsina: " << theRect.GetArea() << endl;
}

void DoGetPerim(Rectangle theRect)
{
    cout << "Obim: " << theRect.GetPerim() << endl;
}


Autor je skrenuo paznju da ChangeDimensions ne moze pozvati f-ju, kao npr. DoChangeDimensions(), jer bi u tom sl. dimenzije bile promnjene za lokalnu kopiju pravougaonika u DoChangeDimensions() a ne za pravougaonik u main().

Ovo mi nije bas jasno.
Radi unifikacije u switch case, bilo bi bas zgodno da postoji upravo takva f-ja.

Ako bi postojala f-ja DoChangeDimensions(), koja bi bila identicna bloku ispod case ChangeDimensions (znaci radila bi:
theRect.SetSize(newWidht, newLenght); ne vidim kako ovo ne bi promenilo pravougaonik u main().

I jos nesto. Nije mi jasno kada moze doci do default-a u switch-u.

I jos nesto (2). Zasto su deklarisane nabrojane konstante tipa BOOL ?
Mislim, ocigledno je, da bi se koristile u while testu kao (0) i (1), ali zar TRUE i FALSE nisu sluzbene reci koje bi mogle da se koriste direktno u while testu ? (pa dakle ako je fQuit=FALSE onda je !fQuit=TRUE)


Hvala
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Lokalna kopija!22.08.2003. u 16:13 - pre 250 meseci
Ne znam odakle ti ovaj kod, ali ako je iz neke knjige, preporučio bih da je ako ne baciš, bar odložiš u stranu u korist nečeg boljeg, jer je opasno zastarela a bogami i daje neke sasvim pogrešne savete.

Najpre što se tiče pitanja za konstante, tip bool i vrednosti true i false su deo savremenog jezika c++. Ovaj program očigledno pojma nema o tome.

Međutim gora stvar je što se u programu koriste eksterne funkcije za obavljanje nečega što treba da bude isključivo u nadležnosti samog objekta. Bilo koje ispisivanje, promena vrednosti i slično, u obliku složenije funkcije treba napisati kao funkciju članicu -- ako ne direktno samog objekta pošto nekada način crtanja nije vezan samo za objekat već i za uređaj na kom se crta ali svejedno, onda nekog drugog objekta koji je zadužen za crtanje (na primer canvas ili kako se već gde zove). Ako su potrebni različiti algoritmi onda opet NE treba koristiti case strukture već izvesti različite klase u kojima se koristi polimorfizam.

I napokon odgovor na tvoje pitanje: koliko vidim objekti se u funkcije prenose po vrednosti (by value), što znači da se za potrebe funkcije pravi lokalna kopija objekta. To automatski znači da kako je ovde deklarisano, ti NE MOŽEŠ menjati direktno objekat unutar funkcija jer u funkciji radiš nad njegovom lokalnom kopijom. Problem je i u tome što se na ovaj način naručuje kopiranje celog objekta za potrebe funkcije (i to default konstruktorom za kopiranje što u nekim slučajevima nije ono što želiš) što može da bude problem ako je objekat veliki prema ukupnoj veličini steka. Treba razmisliti o prenosu objekta po imenu (by reference).


f
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Lokalna kopija!22.08.2003. u 16:20 - pre 250 meseci
Citat:
Međutim gora stvar je što se u programu koriste eksterne funkcije za obavljanje nečega što treba da bude isključivo u nadležnosti samog objekta. Bilo koje ispisivanje, promena vrednosti i slično, u obliku složenije funkcije treba napisati kao funkciju članicu


Filipe, C++ nije Java.

http://www.cuj.com/documents/s=8042/cuj0002meyers/

http://www.codeproject.com/useritems/nonmemberfnoo.asp
 
Odgovor na temu

brcha
Filip Brčić
Beograd, Serbia

Član broj: 440
Poruke: 436

Jabber: brcha@kdetalk.net
ICQ: 40994923
Sajt: brcha.com


+2 Profil

icon Re: Lokalna kopija!22.08.2003. u 16:28 - pre 250 meseci
Kao prvo, ovaj kod radi samo na DOSu bez ikakvog razloga. Evo ti patch da radi i pod GNU Com (fajl sam nazvao pretender.cc, a patchujes ga komandom patch -Np1 < pretender.diff)
pretender.diff:
Code:

diff -Naur old/pretender.cc new/pretender.cc
--- old/pretender.cc    2003-08-22 17:10:52.000000000 +0200
+++ new/pretender.cc    2003-08-22 17:11:46.000000000 +0200
@@ -4,10 +4,20 @@
 // vezano za pravougaonik
 
 # include <iostream.h>
+#ifdef __GNUC__ 
+# include <curses.h>
+#else
 # include <conio.h>
+#endif
 
 typedef unsigned short int USHORT;
 typedef unsigned long int ULONG;
+#ifdef FALSE
+#undef FALSE
+#endif
+#ifdef TRUE
+#undef TRUE
+#endif
 enum BOOL {FALSE, TRUE};
 enum CHOICE {DrawRect = 1, GetArea,
              GetPerim, ChangeDimensions, Quit};
@@ -61,7 +71,7 @@
 void DoGetPerim(Rectangle);
 
 
-void main()
+int main()
 {
       //inicijalizuje pravougaonik na 30, 5
       Rectangle theRect(30,5);
@@ -109,6 +119,7 @@
           }                // kraj switch
       }             // kraj while
 getch();
+return 0;
 }            // kraj main
 
 


Drugo, slazem se sa filmilom, nema razloga da se pozivaju eksterne funkcije kad to sve moze da se nagura u objekat (ili ako originalni objekat nema te osobine, nasledis ga i dodas ih).

Trece, naravno treba koristiti reference (znaci funkcije deklarises kao void DoDrawRect(Rectangle& theRect)) ili pointere ako je u pitanju neki stariji C++.

Pozdrav
Filip
... and the aliens sent an android down to earth, to slow down mankind's development
... and they named it Bill Gates.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Lokalna kopija!22.08.2003. u 16:36 - pre 250 meseci
Umalo da zaboravim

http://www.gotw.ca/publications/mill02.htm
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Lokalna kopija!22.08.2003. u 16:39 - pre 250 meseci
Citat:
brcha:
nema razloga da se pozivaju eksterne funkcije kad to sve moze da se nagura u objekat (ili ako originalni objekat nema te osobine, nasledis ga i dodas ih).


Aaaaaaaaaaaaahhhhhhhhhhhhhhhh!!!!!

Trčim u WC da plačem - valjda niko neće da mi traži dva dinara (dolara).
 
Odgovor na temu

brcha
Filip Brčić
Beograd, Serbia

Član broj: 440
Poruke: 436

Jabber: brcha@kdetalk.net
ICQ: 40994923
Sajt: brcha.com


+2 Profil

icon Re: Lokalna kopija!22.08.2003. u 16:58 - pre 250 meseci
Izvini, jel nije lepse da se kaze theRect.draw() nego DoDrawRect(theRect)?

Nisam rekao da je u svakom slucaju bolje da budu funkcije unutar objekta, ali ovde je lepse, po meni.
... and the aliens sent an android down to earth, to slow down mankind's development
... and they named it Bill Gates.
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.client.attbi.com



+18 Profil

icon Re: Lokalna kopija!22.08.2003. u 17:08 - pre 250 meseci
Nemanja, ne mogu bas da se slozim sa tobom. Cini mi se da je ovde vise diskusija o licnim ukusima nego o tome sta je bolje. Ja licno vise volim da stavljam stvari u objekte nego van njih, ali sumnjam da tu moze da se dokaze da je nesto bolje a nesto gore. Takodje ne mislim da je primarna funkcija OOa sakrivanje pristupa, ali siguran sam da bi i oko toga mogli dugo da se raspravljamo ;)

Nego sto se tice clanka na codeprojectu i stringova: postoji i treca opcija, a to je da se metode tipa Insert, Trim, Replace, itd koje ne menjaju objekat budu static, recimo ovako:

string a, b, c;
a=String.Replace(b,c);

Na taj nacin su svi srecni (i ovce na broju sto bi rekla narodna poslovica): OO puristi imaju sve metode u objektu, a oni kojima smeta to sto Trim naizgled deluje kao da utice na stanje stringa dobijaju nesto sto je ociglednije.

Mada opet, to je sve samo stvar ukusa.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Lokalna kopija!22.08.2003. u 17:21 - pre 250 meseci
Žao mi je gospodo, ali nije u pitanju "stvar ukusa" i "šta je lepše", već je jednostavna činjenica da pametna upotreba funkcija ne - članica unapređuje dizajn. Meyers ide tako daleko da predlaže sledeći algoritam:

Code:

if (f needs to be virtual)
   make f a member function of C;
else if (f is operator>> or
         operator<<)
   {
   make f a non-member function;
   if (f needs access to non-public
       members of C)
      make f a friend of C;
   }
else if (f needs type conversions
         on its left-most argument)
   {
   make f a non-member function;
   if (f needs access to non-public
       members of C)
      make f a friend of C;
   }
else if (f can be implemented via C's
         public interface)
   make f a non-member function;
else
   make f a member function of C;



U članku na Code Project-u sam predložio malo relaksiraniji pristup ovom problemu koji uzima u obzir i čitljivost koda i "labav" odnos objekata, ali tvrdim da se funkcije ne-članice ne koriste dovoljno u programerskoj praksi zbog nekih ideoloških gluposti.

Relja, statičke funkcije nisu isto što i funkcije ne - članice. One imaju pristup privatnim članovima klase, a to je loše. Osim toga, samo po sebi je loše gurati u klasu funkcije koje ne treba da budu članice klase samo da bi "OO puristi" bili zadovoljni. Uostalom, pravi "OO puristi" i ne koriste C++, već SmallTalk :)
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon Re: Lokalna kopija!22.08.2003. u 18:14 - pre 250 meseci
Hvala na odgovorima.

Izvinjavam se ako sam izazvao CyberWar163, nisam hteo.

Mislim da razumem zasto Vam ovaj program ne izgleda optimalno.
On predstavlja rezime do sada predjenih oblasti (7 dana) u knjizi (C++ za 21 dan - Jesse Liberty). Tako da verovatno ne pretenduje da bude savrsen, nego da prikaze sto vise razlicitih `munja`(npr. poslednje su obradjene upravo SWITCH strukture). Neki od koncepata koje pominjete (kao npr.pokazivaci) upravo slede.

Sto se tice gornje problematike, nisam siguran da razumem kako f-ja pristupa SetSize(newWidht, newSize), moze da promeni objekat theRect (u kojem je deklarisana) ako je pozvana direktno iz main(), a ne moze ako je pozvala neka druga f-ja. After all, ona jeste f-ja pristupa tog objekta sta god da je pozove- ali ako se ovde radi o enkapsulaciji "na delu" OK, usvojicu to tako.

Pod pretpostavkom da sam gore `pogodio`, da li mogu da zakljucim da ako zelim da promene afektuju objekt- pozivam odgovarajucu pristupnu f-ju direktno, a ako to ne zelim pozivam doticnu f-ju iz neke druge (naravno, na ovom nivou znanja, bez pokazivaca, itd).

U vezi brchinog dobronamernog predloga, moram da priznam da ne znam tacno kako bih izveo to patch-ovanje: gde, sta u Builderu (ili kodu) da ukucam (i meni je dosadio taj DOS prozor)/imam Borland 6.0 Enterprise Suite/. (Pored toga ne razumem bas ni kod koji si mi dao. - ali to sad nije bitno). Ili je mozda pametnije da tu mikrohirurgiju ostavim za kasnije.

I na kraju, verovatno ste prevideli ono pitanje o default-u iz switch strukture.


Besten Dank
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Lokalna kopija!22.08.2003. u 20:51 - pre 250 meseci
Citat:
Dragi Tata:
Žao mi je gospodo, ali nije u pitanju "stvar ukusa" i "šta je lepše", već je jednostavna činjenica da pametna upotreba funkcija ne - članica unapređuje dizajn.
Verovatno nisam dobro shvatio to na sta si mislio, ali ne vidim zasto je to "jednostavna cinjenica" - zbog cega je to bolje od onog drugog? Koji su (nesubjektivni) argumenti?
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Lokalna kopija!22.08.2003. u 20:57 - pre 250 meseci
Nesubjektivni argumenti:

1) Bolja enkapsulacija

2) "Loose object coupling"


 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Lokalna kopija!22.08.2003. u 22:08 - pre 250 meseci
Nemanja, izgleda da cemo morati da se "dogovorno ne slozimo". Po meni nasilno cupanje metoda samo zato sto ih je moguce implementirati bez pristupa privatnim clanovima nije dovoljan razlog za to da objekti i njegovi metodi ne budu nikako povezano. Ne mislim da je enkapsulacija bolja na taj nacin. Kad smo vec kod toga, mislim da postoji dobra i losa enkapsulacija, ali o tome drugi put.

Loose-coupling: kao i u svemu ostalom, potrebna je mera. Ne mislim da u Triangle treba trpati sve pa i D3D9Draw, osim ako se Triangle klasa ne koristi bas za tu svrhu. Ali takodje ne mislim da iz te klase treba sve pocupati - to je drugi esktrem, i tu se smanjuje prakticna vrednost te klase. Jer ako dovoljno temeljno primenimo onaj algoritam od malopre koji si spomenuo, dobicemo jedan fin skup proceduralnih APIja koji barataju svacime... Ni to nije ideja.

Moje vidjenje je da su odluke ovog tipa stvarno stvar ukusa i da ne postoji univerzalno resenje. Sve zavisi od konkretnog problema koji se resava i malo inzinjerske sposobnosti da se odredjena teoretska pravila ne prate do ekstrema. Otprilike kao sto apsolutna normalizacija baze podataka nije uvek najbolje resenje, isto tako i ovo ovde.

U svakom slucaju, let's agree to disagree.

Pozdrav,
Relja
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Lokalna kopija!22.08.2003. u 22:36 - pre 250 meseci
Izvini Relja, ali od dogovora nema ništa. Uopšte nisam spreman da prihvatim da je to stvar ukusa.

Citat:
Po meni nasilno cupanje metoda samo zato sto ih je moguce implementirati bez pristupa privatnim clanovima nije dovoljan razlog za to da objekti i njegovi metodi ne budu nikako povezano.


Polazimo od različitih stanovišta: ti govoriš o "nasilnom čupanju metoda iz klase", a ja govorim o "nasilnom trpanju funkcija u klasu". A objekti i njihovi metodi su naravno povezani i ako metodi nisu članovi klase. Pogledaj onaj Sutter-ov članak na koji sam ostavio link.

Citat:
Ne mislim da je enkapsulacija bolja na taj nacin


Samo mi reci jesi li pročitao Meyers-ov članak? Čovek dokazuje da enkapsulacija jeste bolja na taj način. Uostalom, meni je sasvim očigledno da je enkapsulacija bolja kad nemaš pristup privatnom delu klase. Ne razumem na osnovu čega možeš da tvrdiš suprotno.

Citat:
Loose-coupling: kao i u svemu ostalom, potrebna je mera. Ne mislim da u Triangle treba trpati sve pa i D3D9Draw, osim ako se Triangle klasa ne koristi bas za tu svrhu. Ali takodje ne mislim da iz te klase treba sve pocupati - to je drugi esktrem


Naravno, tu možemo da se složimo. Ali ako pogledaš malo bolje, cela priča je počela kada se Filip prenerazio što vidi funkcije ne-članice u C++u. Niko ne kaže (čak ni Meyers) da sve funkcije treba da budu ne-članice (onda se vraćamo na proceduralno programiranje). Ali treba koristiti ne-članice mnogo češće nego što to čini većina programera. U suprotnom dobijemo klase kao što je ova:

http://msdn.microsoft.com/libr...ml/_mfc_cwnd_class_members.asp
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
217.26.67.*

ICQ: 60630914


+1 Profil

icon Re: Lokalna kopija!23.08.2003. u 01:00 - pre 250 meseci
Citat:
Dragi Tata:
Naravno, tu možemo da se složimo. Ali ako pogledaš malo bolje, cela priča je počela kada se Filip prenerazio što vidi funkcije ne-članice u C++u. Niko ne kaže (čak ni Meyers) da sve funkcije treba da budu ne-članice (onda se vraćamo na proceduralno programiranje). Ali treba koristiti ne-članice mnogo češće nego što to čini većina programera. U suprotnom dobijemo klase kao što je ova:

http://msdn.microsoft.com/libr...ml/_mfc_cwnd_class_members.asp


... ili dobijes nesto kao cocoa framework koja sa objective c-om daje skoro neprirodan nivo apstrakcije koji te na trenutke vodi do apsurdnog i ponekada tesko uhvatljivog koda . meni je licno kalemljenje objektnog modela u/na c (da li kroz c++ ili objective c) prilicno nasilje, ali to je postao industrijski standard kao i mnogo drugih stvari. OO implementacija nad jezikom koji nije za to podesan ni u kojem slucaju ne moze biti elegantno resenje i uvek vodi do mnogo izuzetaka, kao sto je i ovde slucaj.
 
Odgovor na temu

brcha
Filip Brčić
Beograd, Serbia

Član broj: 440
Poruke: 436

Jabber: brcha@kdetalk.net
ICQ: 40994923
Sajt: brcha.com


+2 Profil

icon Re: Lokalna kopija!23.08.2003. u 03:17 - pre 250 meseci
Kako nije stvar ukusa? Naravno da ne treba preterivati... Preterano nasledjivanje (posebno multiple inheritance) povecava kompleksnost programa i verovatno usporava njegovo izvrsavanje. U sustini OO programiranje omogucava programerima lakse programiranje, a ne korisnicima brze izvrsavanje, ali ipak treba imati meru u svemu. Isto tako, ako se program suvise oslanja na IDL objekte, to ce znacajno da uspori ceo program, ali ce, sa druge strane, program biti vise reusable. Izmedju te dve stvari treba naci sredinu, sto u sustini i nije stvar ukusa, nego vise nekog osecaja gde sta treba da se uradi. I suvise zavisi od sustine problema da bi moglo da se dokaze sta je bolje, a sta losije. Naravno da ne zelim nikoga da omalovazavam (niti imam pravo na to), ali sve teorije oko OO programiranja vise treba da budu vise neka okvirna uputstva nego striktno algoritamski definisana pravila. Sto kaze Morpheus u Matrix-u - I can only show you the door, but you must walk through it!

Kao primer lose objektne orjentisanosti moze da se uzme i Borlandova biblioteka OWL (nekadasnji pandan MFCu). Biblioteka je savrseno lepo organizovana, vrlo logicno razvijana, ali na kraju ispada suvise kompleksna da bi bila zgodna za upotrebu.

Isto tako, ne razumem zasto OO vezujete za jezik. Moze OO program da se pise i u asembleru. To je vise stvar pristupa problemu nego stvar jezika. Uostalom, secate li se biblioteke D-Flat pod DOSom (za pravljenje konzolnih aplikacija sa menijima, prozorima i sl) koja je bila potpuno OO u cistom C-u. A ne mozete da kazete da je C OO jezik!
... and the aliens sent an android down to earth, to slow down mankind's development
... and they named it Bill Gates.
 
Odgovor na temu

brcha
Filip Brčić
Beograd, Serbia

Član broj: 440
Poruke: 436

Jabber: brcha@kdetalk.net
ICQ: 40994923
Sajt: brcha.com


+2 Profil

icon Re: Lokalna kopija!23.08.2003. u 03:28 - pre 250 meseci
Citat:
Pretender:
Sto se tice gornje problematike, nisam siguran da razumem kako f-ja pristupa SetSize(newWidht, newSize), moze da promeni objekat theRect (u kojem je deklarisana) ako je pozvana direktno iz main(), a ne moze ako je pozvala neka druga f-ja. After all, ona jeste f-ja pristupa tog objekta sta god da je pozove- ali ako se ovde radi o enkapsulaciji "na delu" OK, usvojicu to tako.


Stvar je u tome da druga funkcija ne barata sa objektom theRect nego sa njegovom kopijom! Sa druge strane, ako saljes pointer, saljes kopiju adrese na kojoj se nalazi theRect, ali na toj adresi se nalazi bas taj objekat, tako da njega mozes bez problema da menjas. A tu adresu ne mozes (niti imas potrebu) da menjas. Reference su noviji tip podataka koji je neka vrsta transparentnog pointera, odn. ne moras da se bavis sa pointerima, nego baratas sa normalnim objektom. Shvatices kad procitas ta sledeca poglavlja.

Citat:

U vezi brchinog dobronamernog predloga, moram da priznam da ne znam tacno kako bih izveo to patch-ovanje: gde, sta u Builderu (ili kodu) da ukucam (i meni je dosadio taj DOS prozor)/imam Borland 6.0 Enterprise Suite/. (Pored toga ne razumem bas ni kod koji si mi dao. - ali to sad nije bitno). Ili je mozda pametnije da tu mikrohirurgiju ostavim za kasnije.


Zaboravi na to. To je ulazni kod za UNIX alatku patch. Nisam siguran da postoji na windowsu osim u okviru cygwin (ili nekog slicnog) okruzenja.

Citat:

I na kraju, verovatno ste prevideli ono pitanje o default-u iz switch strukture.


Pa cini mi se da nikad nece doci do tog koda. Moze da se izbaci ili taj default ili onaj if pre switcha.
... and the aliens sent an android down to earth, to slow down mankind's development
... and they named it Bill Gates.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..g-c5300-4.dialup.nethere.net



+6 Profil

icon Re: Lokalna kopija!23.08.2003. u 05:19 - pre 250 meseci
Dobro, kad smo se složili da treba odlučivati od slučaja do slučaja, da se vratimo na izvorni problem. Zašto mislite da funkcija DoDrawRect treba da bude članica klase? Šta bi se time konkretno doblo, ukusi na stranu. Što se mene tiče, ja bih samo promenio deklaraciju da bude

Code:

void DoDrawRect(const Rectangle& theRect)


Beneficija: mala dobit u performansama (nema kopiranja objekta).
 
Odgovor na temu

brcha
Filip Brčić
Beograd, Serbia

Član broj: 440
Poruke: 436

Jabber: brcha@kdetalk.net
ICQ: 40994923
Sajt: brcha.com


+2 Profil

icon Re: Lokalna kopija!23.08.2003. u 11:26 - pre 250 meseci
Apsolutno nema nikakve razlike da li se koristi referenca ili se poziva funkcija clanica. Jedino sto bi se funkcijom clanicom dobilo su dve ret instrukcije manje i par push instrukcija manje, odn. ne bi se pozivale funkcije theRect.GetHeight() i .GetWidth() nego bi se direktno koristile privatne promenljive itsWidth i itsHeight, a to i nije neka razlika. Mada to isto moze da se postigne i deklarisanjem funkcije DoDrawRect(const Rectangle& theRect) kao prijateljsku (friend) funkciju klase. Dakle, sustinsku razliku ja ne vidim.

Razlika moze da postoji ako bi Rectangle imao apstraktnu funkciju Draw, pa da se posle nasledi u ConsoleRectangle, BGIRectangle, OpenGLRectangle, GTKRectangle i slicno. U takvom slucaju se razlika u kodu pravi samo u deklaraciji promenljive, a uvek se iscrtava sa theRect.Draw() (odn, onda bi trebalo dinamicki alocirati tu promenljivu sa new kao odgovarajuci ...Rectangle, ali necu sad da komplikujem celu pricu).
... and the aliens sent an android down to earth, to slow down mankind's development
... and they named it Bill Gates.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: Lokalna kopija!23.08.2003. u 12:22 - pre 250 meseci
Ja se slazem sa Reljam-om ovaj put. Stvar je ukusa programera sta ce i kako ce da koristi. Nemanja ce verujem da uleti sa pricom o dobroj/losoj programerskoj praksi... A meni ce CUJ i CodeProject da pokazu sta je dobra programerska praksa? - Nesto nisam bas ubedjen u to...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

[es] :: C/C++ programiranje :: Lokalna kopija!

Strane: 1 2 3

[ Pregleda: 7770 | Odgovora: 40 ] > FB > Twit

Postavi temu Odgovori

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