[ Pretender @ 18.09.2003. 20:50 ] @
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.
[ filmil @ 18.09.2003. 21:50 ] @
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
[ Pretender @ 20.09.2003. 16:46 ] @
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

[ Pretender @ 21.09.2003. 23:01 ] @
Resio sam `nejasnocu`. [sad je malo blam]