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

Objašnjenje za „:“

[es] :: C/C++ programiranje :: Objašnjenje za „:“

[ Pregleda: 2915 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon Objašnjenje za „:“13.09.2003. u 01:31 - pre 250 meseci
Mr. Jesse pocinje da koristi operator : , bez neke nelagode sto ga prethodno nije objasnio. Npr:

Code:

SimpleCat::SimpleCat(int age, int weight) :
itsAge(age), itsWeight(weight) {} 


Rekao bih da je ovo analogno sa:

Code:

SimpleCat::SimpleCat(int age, int weight)
{
itsAge = age;
itsWeight = weight;


Ako sam u pravu onda je valjda to trebalo i napomenuti, bar u jednoj recenici.(znam da ste mi vec skrenuli paznju na Mr.Jessija)

ili

Code:

class Employee
...itd

float Employee : GetRoundedThousands() const
{
     return Salary/1000


Sta znaci ovo? Mislio sam da se metod poziva navodjenjem imena objekta, posle cega sledi (.) i ime metoda. Pored toga, ovaj metod nije prethodno nigde deklarisan ni definisan/ovo je prosirenje prethodno kreirane klase/ (ili je upravo ovo deklar./defin. ali meni nepoznate sintakse).

Hvala na eventualnim odgovorima.
 
Odgovor na temu

Mrav
Aleksandar Mraović
.net programer u Wireless Media
Beograd

Član broj: 6532
Poruke: 279
195.252.80.*

ICQ: 197419540


Profil

icon Re: Objašnjenje za „:“13.09.2003. u 13:59 - pre 250 meseci
Za ovo prvo si u pravu. Ovo drugo meni već liči na neku grešku, kao da je u pitanju definicija f-je deklarisane u klasi employee, ali da je ispusten jedan znak : (treba :: ), mora biti da je f-ja prethodno deklarisana u toj klasi, a ako nije i to je greška. Nemoguće je dodavati metode f-ji ako nisu bar deklarisane u klasi.
Lepota je u jednostavnosti.

Cis.
 
Odgovor na temu

t3chX
Srđan Rajčević
Thessaloniki

Član broj: 2509
Poruke: 101
*.otenet.gr

Jabber: techx@elitesecurity.org


Profil

icon Re: Objašnjenje za „:“13.09.2003. u 15:50 - pre 250 meseci
Citat:

Sta znaci ovo? Mislio sam da se metod poziva navodjenjem imena objekta, posle cega sledi (.) i ime metoda. Pored toga, ovaj metod nije prethodno nigde deklarisan ni definisan/ovo je prosirenje prethodno kreirane klase/ (ili je upravo ovo deklar./defin. ali meni nepoznate sintakse).


Ja mislim ipak da bi ti trebao jos nekakvu knjigu da nabavis o osnovama OOP-a u C++-u, a posebnu paznju da obratis na dinamicke i staticke objekte i pozivanje njihovih metoda (operatori . i ->).
If you want to get anywhere in your life, don't break the rules - make them !
 
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: Objašnjenje za „:“13.09.2003. u 19:18 - pre 250 meseci
Molio bih te da mi das kompletan kod od ovog treceg primera...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

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

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Objašnjenje za „:“13.09.2003. u 19:44 - pre 250 meseci
Citat:
Pretender:
Mr. Jesse pocinje da koristi operator : , bez neke nelagode sto ga prethodno nije objasnio.

I tako, treći jubilarni put tebi, a ko zna koji put inače, kažem da ostaviš na stranu knjigu C++ za 21 dan i uzmeš nešto bolje. :) Šta o knjigama za učenje programiranja za 21 dan kaže veliki sensei Peter Norvig, autor biblije „Artificial Intellivence: A Modern Approach“ i trenutno vodeći stručnjak firme Google, možeš pročitati na njegovoj stranici „Learn Programming in 10 years“ na adresi: http://www.norvig.com/21-days.html

Citat:

Code:

SimpleCat::SimpleCat(int age, int weight) :
itsAge(age), itsWeight(weight) {} 


Rekao bih da je ovo analogno sa:

Code:

SimpleCat::SimpleCat(int age, int weight)
{
itsAge = age;
itsWeight = weight;



I jeste ali i nije. U slučaju ugrađenih tipova poput int, char i slično, efekat je potpuno isti. Ali ako treba inicijalizovati neki objekat koji je uključen u našu klasu, videćeš da je to jedini mogući način da se objekat inicijalizuje. Pošto primer govori više od hiljadu reči, zamislimo da imamo klasu

Citat:

class VelikaKlasa {
VelikaKlasa();
private:
int obicnaPromenljiva;
MalaKlasa neobicnaPromenljiva;
}


Pri konstrukciji VelikeKlase treba dodeliti početne vrednosti i običnoj i neobičnoj promenljivoj. Iako je kao, što si primetio, za tip int svejedno gde će se naći inicijalizacija, za MaluKlasu jedini izlaz je inicijalizacija posle operatora „:“, jer je ovo sintaksno neispravno:

Citat:

VelikaKlasa::VelikaKlasa() {
obicnaPromenljiva = 0;
neobicnaPromenljiva(pocetnaVrednost); // ovo je neispravno
neobicnaPromenljiva = pocetnaVrednost; // ovo je neispravno osim ako ne definišeš operator dodele
}


Dodatni problem je što pre nego što počne da se izvršava telo konstruktora, za obe promenljive se mora alocirati prostor (zbog tipa agregacije) što znači da se implicitno za neobicnuPromenljivu poziva default konstruktor pre nego što se krene sa izvršavanjem tela konstruktora naše VelikeKlase, što nije uvek ono što želiš.

Drugim rečima, ako bi se sve radilo bez dvotačke, morao bi em da definišeš dodatni operator, u ovom slučaju recimo =, em bi se konstrukcija sadržane klase obavezno radila dvaput, i to bez potrebe!. Zato je i uvedena lista za inicijalizaciju. A čisto da ilustrujem kako to izgleda u dobrim knjigama o C++-u, reći ću ti da čika Bjarne sasvim lepo i detaljno objašnjava gore pomenutu anomaliju u „The C++ Programming Language“.

Ostaje zaključak da se mora uraditi ovako:

Citat:

VelikaKlasa::VelikaKlasa() : neobicnaPromenljiva(pocetnaVrednost),
obicnaPromenljiva(0)
{
// obicnaPromenljiva = 0; // moglo je i ovde da stoji umesto gore
}


Citat:

Code:

float Employee : GetRoundedThousands() const
{
     return Salary/1000


Sta znaci ovo?


Ovaj kod sigurno nije dobar. Naime ako ništa drugo, a ono fali tačka i zapeta kao oznaka za kraj naredbe posle konstante 1000. A kao drugo mislim da je u pitanju česta greška koju prave izdavači koji svoje knjige formatiraju u wordu ili nekoj sličnoj gluposti. U tvom primeru fali još jedna dvotačka posle Employee i jedna tačka i zapeta posle 1000 da bi definicija funkcije bila ispravna. Pošto u oba slučaja fali interpunkcija rekao bih da je neko zeznuo stvar pri copy/paste u pripremi knjige.

f
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon Re: Objašnjenje za „:“16.09.2003. u 22:04 - pre 250 meseci
Veliko izvinjenje leki. Nisam ocekivao nove postove u ovoj temi, pa zato kasnim sa reakcijom. Evo kompletnog 3.primera:


3. Write a program with the Employee class that makes two Employees; sets their age, YearsOfService, and Salary; and prints their values.
Code:
 
main()
{
    Employee John;
    Employee Sally;
    John.SetAge(30);
    John.SetYearsOfService(5);
    John.SetSalary(50000);

    Sally.SetAge(32);
    Sally.SetYearsOfService(8);
    Sally.SetSalary(40000);

    cout << "At AcmeSexist company, John and Sally have the same
job.\n";
    cout << "John is " << John.GetAge() << " years old and he has
been with";
    cout << "the firm for " << John.GetYearsOfService << "
years.\n";
    cout << "John earns $" << John.GetSalary << " dollars per
year.\n\n";
    cout << "Sally, on the other hand is " << Sally.GetAge() << "
years old and has";
    cout << "been with the company " << Sally.GetYearsOfService;
    cout << " years. Yet Sally only makes $" << Sally.GetSalary();
    cout << " dollars per year!  Something here is unfair.";


4. Continuing from Exercise 3, provide a method of Employee that reports how many thousands of dollars the employee earns, rounded to the nearest 1,000.
 
float Employee:GetRoundedThousands()const
{
    return Salary / 1000;
}

(ovde se zahvaljujem srkiju na sugestijama, vezano za pisanje koda)


Veliko hvala filmilu i mravu.
Filmilu:
Objasnjenja su vrlo precizna i znacajna.
Sto se tice (;)posle 1000, to je moja greska u kucanju.

Moram da se izvinim tebi ali i ostalima, sto smaram sa 1, ocigledno nedovoljno kvalitetnom knjigom, ali sta cu kada na srpskom postoji, pored ove, samo jos 1 "debela" knjiga, `Izvornik C++`, a koju cu ionako dobiti kada upisem C++ u privatnoj skoli,(kada zavrsim ovaj samostalni `kurs`). Stoga mislim da bi bilo glupo da se izlazem duplom trosku.
Mogao bih da `ispratim` i englesku knjigu, ali to bi mi oduzelo vise vremena, a verovatno bi se provukao i neki misunderstanding.

Zato se jos jednom zahvaljujem svima na strpljenju.

Pozdrav

 
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: Objašnjenje za „:“16.09.2003. u 22:08 - pre 250 meseci
Bolje da si kupio "The C++ Primer" i poceo sa njom, nego sto si kupio to njesra za "21 dan"... Ja sam "The C++ Primer" procitao od poctka do kraja bar 4 puta.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Mikky

Član broj: 18
Poruke: 1563
*.vdial.verat.net

ICQ: 44582291


+58 Profil

icon Re: Objašnjenje za „:“16.09.2003. u 23:39 - pre 250 meseci
To sto se knjiga zove "...za 21 dan" nemora da znaci da je sr***, konkretno znam da je ta C++ za 21 dan jako dobra knjiga.
Imas i knjige "... za 24 casa", sta li tek mislis o njima?
-I know UNIX, PASCAL, C, FORTRAN,
COBOL, and nineteen other high-tech
words.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Objašnjenje za „:“

[ Pregleda: 2915 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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