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

pokazivaci u funkcijama

[es] :: C/C++ programiranje :: pokazivaci u funkcijama

[ Pregleda: 2459 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon pokazivaci u funkcijama18.09.2003. u 20:50 - pre 250 meseci
Imam problem sa tumacenjem pokazivaca u funkciji.

Code:
1:  //Listing 9.11
2:       // Passing pointers to objects
3:
4:         #include <iostream.h>
5:
6:         class SimpleCat
7:         {
8:         public:
9:                 SimpleCat();
10:                 SimpleCat(SimpleCat&);
11:                 ~SimpleCat();
12:
13:                 int GetAge() const { return itsAge; }
14:                 void SetAge(int age) { itsAge = age; }
15:
16:         private:
17:                 int itsAge;
18:            };
19:
20:            SimpleCat::SimpleCat()
21:            {
22:                   cout << "Simple Cat Constructor...\n";
23:                   itsAge = 1;
24:            }
25:
26:            SimpleCat::SimpleCat(SimpleCat&)
27:            {
28:                   cout << "Simple Cat Copy Constructor...\n";
29:            }
30:
31:            SimpleCat::~SimpleCat()
32:            {
33:                   cout << "Simple Cat Destructor...\n";
34:            }
35:
36:const SimpleCat * const FunctionTwo (const SimpleCat * const theCat);
37:
38:            int main()
39:            {
40:                   cout << "Making a cat...\n";
41:                   SimpleCat Frisky;
42:                   cout << "Frisky is " ;
43                    cout << Frisky.GetAge();
44:                   cout << " years _old\n";
45:                   int age = 5;
46:                   Frisky.SetAge(age);
47:                   cout << "Frisky is " ;
48                    cout << Frisky.GetAge();
49:                   cout << " years _old\n";
50:                   cout << "Calling FunctionTwo...\n";
51:                   FunctionTwo(&Frisky);
52:                   cout << "Frisky is " ;
53                    cout << Frisky.GetAge();
54:                   cout << " years _old\n";
55:     return 0;
56:            }
57:
58:    // functionTwo, passes a const pointer
59:    const SimpleCat * const FunctionTwo (const SimpleCat * const theCat)
60:    {
61:             cout << "Function Two. Returning...\n";
62:             cout << "Frisky is now " << theCat->GetAge();
63:             cout << " years old \n";
64:             // theCat->SetAge(8);   const!
65:             return theCat;
66: }

Output: Making a cat...
Simple Cat constructor...
Frisky is 1 years old
Frisky is 5 years old
Calling FunctionTwo...
FunctionTwo. Returning...
Frisky is now 5 years old
Frisky is 5 years old
Simple Cat Destructor...



1) Deklaracija/definicija FunctionTwo kaze da ta f-ja vraca const pokazivac na const objekat klase SimpleCat.
2) Arg. te f-je je takodje pokazivac (*const theCat)

Return ove f-je, medjutim, vraca theCat (sto je, u stvari samo adresa objekta, a ne pokazivac kako kaze deklaracija).

Zasto u returnu nije *theCat?

After all, ova f-ja nista ni ne vraca, nego samo stampa neki rezultat. Pa da li je onda moguce da se izostavi return ?

Dodatno pitanje bi bilo i: zasto operator za indirekciju (->), kada objekat nije kreiran na slobodnom skladistu (new)? - obzirom na :
Citat:
You accessed data members and functions by using the dot (.) operator for Cat objects created locally. To access the Cat object on the free store, you must dereference the pointer and call the dot operator on the object pointed to by the pointer. Therefore, to access the GetAge member function, you would write

(*pRags).GetAge();

Parentheses are used to assure that pRags is dereferenced before GetAge() is accessed.

Because this is cumbersome, C++ provides a shorthand operator for indirect access: the points-to operator (->)



Hvala na eventualnim odgovorima.
 
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: pokazivaci u funkcijama18.09.2003. u 21:50 - pre 250 meseci
Citat:
Pretender:
Zasto u returnu nije *theCat?


Pogledaj deklaraciju:

Code:

const SimpleCat * const theCat


Funkcija vraća theCat koji je upravo odgovarajućeg tipa. Nema misterije. Kao parametar funkcije prosledio si pointer na objekat, u funkciji odgovarajući parametar obrađuješ kao da je pointer na objekat, i vraćaš ga nazad kao pointer na objekat. A==A.

Citat:

After all, ova f-ja nista ni ne vraca, nego samo stampa neki rezultat. Pa da li je onda moguce da se izostavi return ?

Samo ako promeniš prototip funkcije da vraća void. Ovo se inače zove method chaining, može da služi za simulaciju ne-pozicionih parametara u C++-u, kao recimo pri korišćenju cout gde je moguće nadovezivati više izlaza pošto svaki poziv za operator << vraća referencu na originalni tok. http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.17 Preporučujem da pročitaš ceo FAQ, gledaćeš na C++ drugim očima, garantovano. Probaj da čitanjem FAQ-a kompenzuješ očigledne propuste u tvojoj knjizi (ovo je bio broj 4).

Od sada ću samo da brojim, da ne bih bio dosadan.

Citat:

Dodatno pitanje bi bilo i: zasto operator za indirekciju (->), kada objekat nije kreiran na slobodnom skladistu (new)? - obzirom na :

Nema veze gde je objekat kreiran. Funkciji se prosleđuje pokazivač na objekat i to je sve što se u tom trenutku zna o njemu, ali to je sasvim dovoljno. A==A.

f
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon Re: pokazivaci u funkcijama20.09.2003. u 16:46 - pre 250 meseci
Filmile hvala za koristan link.
Poceo sam da citam ceo FAQ.

Za pocetak, cini mi se da sam shvatio zasto nisam dobio odgovor na temu Resolving memory leaks.

Sto se tice ove teme, molio bih za jedno pojasnjenje.
Da li bi FunctionTwo, ovako kako je deklarisana, mogla da ima -return *theCat-, i u cemu bi se to razlikovalo od -return theCat- (obzirom da se u oba slucaja vraca pokazivac)?

... i da; zasto u ovom primeru nije koristena VOID f-ja ?

Hvala

 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon Re: pokazivaci u funkcijama21.09.2003. u 23:01 - pre 250 meseci
Resio sam `nejasnocu`. [sad je malo blam]
 
Odgovor na temu

[es] :: C/C++ programiranje :: pokazivaci u funkcijama

[ Pregleda: 2459 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

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