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

Read-only promenljiva?

[es] :: C/C++ programiranje :: Read-only promenljiva?

[ Pregleda: 2680 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.ptt.yu.



+9 Profil

icon Read-only promenljiva?17.11.2005. u 08:38 - pre 224 meseci
Ovako, imam jedno pitanje: naime, ako se neka funkcija deklarise ovako:
Code:

void funkcija(const int x);

i ako joj se prosledi neki integer, isti ce biti samo citljiv, ali ne i promenljiv u funkciji funkcija. E sada, sta kada je u pitanju neka klasa? Trenutno zavrsavam jednu igru i javio se sledeci 'problem'. Iznecu ga u kracem obliku:

Code:

class neka_klasa{
  private:
    vector<player*> *x; //player je neka druga klasa...
  public:
    //ovde ide neka funkcija koja vraca npr. adresu promenljive x.
};


Da li je ikako moguce nekim javnim metodom vratiti referencu ili pokazivac na x tako da povratna promenljiva bude read-only, ali i sve sto se nalazi 'ispod' nje. Npr. ako prosledimo x nekoj funkciji, ona ce biti samo citljiva, ali clanovi klase player ce i dalje biti promenljivi. :)

Code:

  x->at(0)->neki_clan_klase_player //ovaj clan je promenljiv iako je x kao promenljiva read-only


Pozdrav. Goran.
 
Odgovor na temu

vladeck
Vladimir Djokic
C++ Programer - Etrage, LLC
http://www.etrage.com
Cacak

Član broj: 6788
Poruke: 99
*.sbb.co.yu.

Sajt: vladeck.wordpress.com


Profil

icon Re: Read-only promenljiva?17.11.2005. u 08:52 - pre 224 meseci
iskreno, nisam te skontao :? ali, ako hoces da je objekat na koji pokazivac pokazuje nepromenljiv:

Code:
const __tip__* pokazivac (recimo: const int* pokazivac)
,

a, ako hoces da vrednost pokazivaca (njegova adresa) bude nepromenljiva:

Code:
__tip__* const pokazivac (recimo: int* const pokazivac)
.

moze i kombinacija:

Code:
const __tip__* const pokazivac (recimo: const int* const pokazivac)
.

mozda ti ovo pomogne?
"There's no room for ideals in this mechanical place. There has to be passion."
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.dsl.pipex.com.



+4 Profil

icon Re: Read-only promenljiva?17.11.2005. u 11:49 - pre 224 meseci
Ako vec drzhish takav vector u klasi i hocesh da mu pristupish spolja, bolje je da napravish mali wrapper u samoj klasi koji ce vracati iterator(e) kako bi sakrio implementaciju kontejnera.

Takodje, na temu const-korektnosti pogledaj STL konstrukte : const_iterator i const_reference
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.242.EUnet.yu.



+9 Profil

icon Re: Read-only promenljiva?17.11.2005. u 19:06 - pre 224 meseci
@vladeck
Hvala... ali mislim da nisam dovoljno dobro onda objasnio.

@NastyBoy
I tu bi se najverovatnije javio mali problem. Članovi vektora su pokazivači, a njihove konstantne vrednosti mi ne vrše posao. Treba da bude konstantno ono na šta oni pokazuju.

Npr.
Code:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<int*> x;
  //popunjavam sada vektor bilo čime
  int x = 5; int y = 3;
  x.push_back(&x); x.push_back(&y);
  
  for(vector<int*>::const_iterator i = x.begin(); i < x.end(); i++){
    **i = 3; //prepisujem sve elemente sa trojkom, i to radi i ako je i deklarisano kao const_iterator
  }
}
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Read-only promenljiva?17.11.2005. u 23:10 - pre 224 meseci
Da ponovim josh jedared :) - nemoj da izlazhesh tek tako kontejnere : to treba da je interna stvar tvoje klase.

Const-korektnost u tvom sluchaju chuvanja pointera, mozhesh jednostavno reshiti, recimo ovako :

Code:


class test1  // recimo, sadrzhi kontejner pointera na int
{
public:
    // nema provere opsega, jednostavan primer
    const int* GetAt(int i) { return array[i]; }
    void Add(int * i) { array.push_back(i); }

private:
    std::vector<int* > array;

};

test1 t;

int i=5, j=6;

t.Add(&i);    t.Add(&j);

int * m = t.GetAt(0); // ERROR - m nije const pointer

const int * k = t.GetAt(0); *k = 5; // ERROR - cannot modify const object!


 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.verat.net.



+9 Profil

icon Re: Read-only promenljiva?18.11.2005. u 11:40 - pre 224 meseci
Da.. otprilike sam isto počeo.. To bi bilo najidealnije onda, samo mi je delovalo isuvise robusno.
Mada, implementacija kontejnera valjda nikom ne bi značila toliko :) ako ne može da radi bilo šta sa njim osim da čita podatke iz njega :)
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.neobee.net.

Jabber: DarkMan


Profil

icon Re: Read-only promenljiva?18.11.2005. u 20:48 - pre 224 meseci
Code:

    const int* k = t.GetAt(0); 
    // *k = 1; // ERROR - cannot modify const object!
    int* a = (int*)k;
    *a = 1;  // *k == 1

Kada radis sa pointerima samo napisi uputstvo za koriscenje i reci zabranjeno menjanje, inace ako neko hoce da promeni vrednost promenice sigurno.
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.neobee.net.

Jabber: DarkMan


Profil

icon Re: Read-only promenljiva?18.11.2005. u 20:49 - pre 224 meseci
Code:

    const int* k = t.GetAt(0); 
    // *k = 1; // ERROR - cannot modify const object!
    int* a = (int*)k;
    *a = 1;  // *k == 1

Kada radis sa pointerima samo napisi uputstvo za koriscenje i reci zabranjeno menjanje, inace ako neko hoce da promeni vrednost promenice sigurno.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Read-only promenljiva?18.11.2005. u 21:40 - pre 224 meseci
*const T*" je dovoljno "uputstvo" svakom programeru.
Surovo kastovanje korisnik ochigledno radi na sopstvenu odgovornost i svesno.
Mada, const-corectness je tema za sebe.

 
Odgovor na temu

[es] :: C/C++ programiranje :: Read-only promenljiva?

[ Pregleda: 2680 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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