[ VukSta @ 27.02.2007. 21:00 ] @
EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]

Tako uokviren (formatizovan) kod će se videti ovako:

Code:

int main ( int argc, char *argv[] )
{
   // ...
   return 0;
}


zasto nece da radi ako definisem Position *pok,a radi za Position pok?


ovo radi:
Code:

#include <iostream.h>

class Position {
    int x, y;
  public:
    Position();
    Position(Position& );
    void set(int new_x, int new_y);
    void get(int* current_x, int* current_y); 
};

Position::Position()
{
    x = 0;
    y = 0; 
}


void 
Position::set(int new_x, int new_y)
{
    x = new_x;
    y = new_y; 
}

void 
Position::get(int* current_x, int* current_y)
{
    *current_x = x;
    *current_y = y; 
}

Position
position;

void
position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}

int
main()
{
    int x, y;
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
    position.set(5,7);
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";

   Position pok;    
    position_input(&pok);
    pok.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
   

}


a ovo ne:

#include <iostream.h>

class Position {
    int x, y;
  public:
    Position();
    Position(Position& );
    void set(int new_x, int new_y);
    void get(int* current_x, int* current_y); 
};

Position::Position()
{
    x = 0;
    y = 0; 
}


void 
Position::set(int new_x, int new_y)
{
    x = new_x;
    y = new_y; 
}

void 
Position::get(int* current_x, int* current_y)
{
    *current_x = x;
    *current_y = y; 
}

Position
position;

void
position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}

int
main()
{
    int x, y;
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
    position.set(5,7);
    position.get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";

  
    Position* pok;    
    position_input(pok);
    pok->get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    
   

}


[Ovu poruku je menjao X Files dana 28.02.2007. u 07:25 GMT+1]
[ radoica @ 27.02.2007. 23:20 ] @
Mozda ovo nedostaje

Code:
Position* pok = new Position();


p.s. stavi kod u code tagove, ovako je bas tesko za citanje!
[ VukSta @ 02.03.2007. 17:02 ] @
Radoice,ovo resava stvar!
jel bi mogao samo malo da mi objasnis zasto je to neophodno?
hvala ti !

@X Files
hvala za sredjivanje posta;)
[ karas @ 02.03.2007. 18:29 ] @
Svrha new operatora je da rezervishe prostor u memoriji za objekat. Uzmi bilo koju knjigu o C++ i prouchi kako se radi sa pokazivachima i memorijom.
[ VukSta @ 02.03.2007. 19:21 ] @
znam da je new za rezervisanje prostora u dinamickoj memoriji,ali zar ne mozemo samo da definisemo pokazivac,zasto moramo da uvodimo dinamicku memoriju u igru?
[ SuPeR_MaSteR @ 02.03.2007. 20:44 ] @
Pa mora da se uvodi dinamicka memorija u igru jer je pokazivac samo tip podataka koji pokazuje na neki objekt u memoriji tako sto sadrzi njegovu adresu, a da bi radio sa slobodnim prostorom u memoriji neophodna je alokacija.
[ VukSta @ 02.03.2007. 21:10 ] @
Jednostavno ne razumem zasto nije moguce samo napisati
Pokazivac* pok;
vec mora
Pokazivac* pok = new Pokazivac();
Zasto moram da alociram memoriju?Kada uopste vrsimo alociranje memorije operatorom new?
Kontam da je ovo za neke od vas verovatno banalno,al mene zbunjuje:(.Moze li malo pojasnjenja?
Hvala!
[ lucky @ 02.03.2007. 22:47 ] @
Pa recimo ovako, resio si da se provozas, ali nemas kola, a hteo bi bas svojim kolima da se provozas. Pozoves lepo CZ i narucis Yuga, pa oni ga naprave i posalju i kad ti isti stigne mozes da se vozas do mile volje, pod uslovom da sipas gorivo.
Yugo *moj = new Yugo();
Znaci, imas auto, mozes da se vozis.

Pokazivac se i zove tako zato sto pokazuje na neku dinamicku promenljivu. Ako ne rezervises prostor u memoriji za tu promenljivu jednostavno ne mozes da je koristis, jer nigde ne postoji.
[ karas @ 03.03.2007. 01:14 ] @
Pokazivač pokazuje na neki deo memorije ali ne garantuje da taj deo memorije nije zauzet, možda se na tom mestu već nalazi neki podatak. Ako želish da smestiš svoj podatak na neko mesto u memoriji, onda moraš da obezbediš parče memorije za taj podatak. To obezbeđivanje se radi preko new.
Dakle,
Code:

Klasa obj;

automatski obezbeđuje memoriju za smeštanje objekta obj, dok
Code:

Klasa* obj;

ne.
[ VukSta @ 03.03.2007. 18:12 ] @
znaci,u gornjem primeru,posto smestam podatke u pokazivac neophodno je alocirati memoriju,"samo" je smestanje u pitanju???

a postoje li situacije kada mozemo koristiti samo

Code:
Klasa* pokazivac
Jel moze neki primer?

[ Mr. Rejn @ 03.03.2007. 19:32 ] @
Citat:
VukSta:
a postoje li situacije kada mozemo koristiti samo
Code:
Klasa* pokazivac
Jel moze neki primer?

Možeš da koristiš kada deklarišeš pointer na objekat tipa te-i-te klase,kako bi
ga kasnije alocirao sa new (npr. kod pravljenja objekata u petlji,stavljanja u niz itd.):
Code:

Klasa* pokazivac;
for (i=0;i<1;i++) {
pokazivac = new Klasa;
pokazivac->NekaMetoda();
delete pokazivac;
                       }


Sa:
Code:

Klasa *pokazivac;

deklarišeš pointer na objekat neke klase,sa
Code:

Klasa pokazivac;

alociraš objekat na stack-u,
a sa
Code:

Position* pok = new Position();

na heap-u. Stek i heap (eng. gomila) su različite lokacije u memoriji,vidi ovde:
http://en.wikipedia.org/wiki/Stack-based_memory_allocation
http://en.wikipedia.org/wiki/Heap-Based_Memory_Allocation

[ karas @ 03.03.2007. 23:39 ] @
Recimo imaš funkciju koja treba da obradi objekat neke klase. Ako je objekat veliki, onda je bolje prihvatiti pokazivač na taj objekat da bi uštedeo memoriju. Tada umesto
Code:
void f(Klasa obj)
napraviš funkciju
Code:
void f(Klasa* obj);
i radiš sa pokazivačem na taj objekat umesto sa samim objektom. Ovo se naravno može uraditi i preko referenci u C++ ali u C-u bi morao da koristiš pokazivač.
Zatim, u kontejnerskim klasama C++ biblioteke imaš iteratore koji su uopštenje pokazivača i sintaksa im je slična. Oni se koriste za rad sa objektima smeštenim u kontejner. Kasnije ćeš stići do toga i videti koliko je to zgodan pristup.
[ VukSta @ 04.03.2007. 19:56 ] @
znaci kad god radim sa pokazivacima,moram da alociram memoriju?
mene je to zbunjivalo,zbog toga sto sam naletao na primere u C-u kada se samo definise pokazivac bez alokacije,npr
Code:

int* a;

tu npr,ne alociram memoriju...
kada moram da alociram memoriju,jel uvek??
[ karas @ 04.03.2007. 22:15 ] @
Ne. Pokazivach kao shto mu ime kazze pokazuje na neki objekat. Pokazivach uzima vrednost adrese nekog objekta. Stavi npr.
Code:

int n = 1;
int* p;
p = &n;

Ovde p uzima vrednost adrese broja n tj. pokazuje na objekat n. Ako uradish
Code:
cout << *p << endl;
, onda ccesh ispisati vrednost broja n. Zashto? Zato shto je pokazivach uzeo memorijsku adresu broja n i pokazuje na sadrzzaj promenljive n. Ako uradish
Code:
*p = 2;
, onda ccesh promeniti vrednost na toj adresi, tj. promeniccesh vrednost na koju pokazuje p tj. promeniccesh vrednost broja n. To mozzesh da proverish opet sa
Code:
cout << *p << endl;

Dakle, pokazivach mozze da pokazuje na vecc postojecci objekat ili mozzesh da napravish novi (sa new) i da pokazivach pokazuje na taj novoformirani objekat.
Najbolje josh jednom prochitaj u knjizi odeljak o pokazivachima (pointerima), pa onda nastavi sa operatorom new.

[ VukSta @ 06.03.2007. 20:14 ] @
da,razumeo sam o cemu se radi.Hvala na iscrpnim objasnjenjima!
samo jos jedno pitanje:
sta se onda zapravo desi kada uradim:

Code:

void
position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}

Position* pok;   
 
position_input(pok);

jel se negde upisuje sadrzaj ili ne?
hvala jos jednom!
necu vas vise smarati sa ovim;)
[ SuPeR_MaSteR @ 06.03.2007. 21:20 ] @
Upisuje se sadrzaj, funkcija position_input() stvara bocne efekte.
[ VukSta @ 06.03.2007. 21:48 ] @
Code:
 
  void get(int* current_x, int* current_y)
{
    *current_x = x;
    *current_y = y; 
}
 
void position_input(Position* p)
{
    int a,b;
    cin>>a;
    cin>>b;
    p->set(a,b);
        
}



    Position* pok ;    
    position_input(pok);
    pok->get(&x, &y);
    cout << "X=" << x << ", Y=" << y << "\n";
    

znaci upise ,ali ne moze da se dohvati sa get?zasto to ako se vec upise negde?jel nije definisano to "negde" ili sta?
[ SuPeR_MaSteR @ 06.03.2007. 22:20 ] @
Mislim da je problem sto si sadrzaju pokazivaca current_x i current_y dodeljivao adrese pokazivaca x i y, prepravi ovako pa probaj:
Code:

void get(int* current_x, int* current_y)
{
    *current_x = *x;
    *current_y = *y; 
}

[ karas @ 06.03.2007. 22:23 ] @
Pozivash position_input() za pok koji pokazuje negde bezveze jer nisi rezervisao memoriju sa new. To znachi da je pok tzv. lutajucci pokazivach. Program mozze da pukne posle 5 minuta a mozze i posle 5 meseci, jer nikada ne znash u koji deo memorije si pisao. Za get() ne vidim da je definisana za klasu Position pa ne razumem kako je pozivash za pok.
[ VukSta @ 06.03.2007. 22:27 ] @
sada sam i to razjasnio,hvala vam,vise vas necu smarati,bar sto se ovoga tice:)
hvala jos jednom!