[ darkosos @ 04.08.2003. 14:50 ] @
Da li je možno deklarisati const array npr.
Code:

class A {
...
const int a[3][3];
...
};

kao člana klase i kako se to inicijalizuje?
Kol'ko sam ja upućen const member mora da se inicijalizuje u konstruktoru (logično), ali nije dozvoljeno "=". Ne da mi ni u listi inicijalizacije jer kaže da se tako ne može inicijalizovati array.
[ leka @ 04.08.2003. 15:49 ] @
Nisam siguran, ali mislim da prema C++ standardu to ne moze da se uradi... Neko resenje bi mozda eventualno bilo da taj "konstantni" niz pretvoris u staticki konstantni niz... Evo kako bi to moglo da izgleda:
Code:

#include <iostream>
#include <stdlib.h>

using namespace std;

class A
{
    public:
        static const int a[3][3];
}; // A

const int A::a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};

int main(int argc, char** argv)
{
    A bla;
    
    cout << bla.a[1][2] << endl;
    
    system("PAUSE");
    return 0;
}


P.S. kod nije portabilan! ;) (system("PAUSE"))
[ darkosos @ 05.08.2003. 08:20 ] @
Da to je i meni palo na pamet. Čak je donekle i logično da ono što je const bude i static u klasi, jer ga dele sve instance. Ali me ipak zanima da li je ovako nešto moguće...
[ Mrav @ 06.08.2003. 15:57 ] @
Đes' Darko. Sinoć sam nešto kodirao (posle dužeg vremena, na odmoru sam nekoliko dana ) , hteo sam za svoju klasu koja čuva objekte (podatke o vertexima, licima itd) da dodam matricu kao član klase. Međutim izgleda da ti je jedino rešenje inicijalizacija u konstruktoru, probao sam i sa klasičnom inicijalizacijom:

float matrix[4][4] = {član1, član2 …, poslednji član};

ali ovo ne radi. Znači ipak ćeš morati da inicijalizuješ sve članove u konstruktoru i to kroz petlju (kada se jednom deklariše, ako se ne inicijalizuju članovi što nisi mogao pošto je matrica članica klase, mora se inicijalizovati član po član).
[ darkosos @ 07.08.2003. 11:07 ] @
Evo me... Ja mesecima nisam ništa pisao... A evo čim krenem, problemi ;)

Fora u ovom primeru je što se traži const, što ti ne dozvoljava da pišeš jednako. Dakle ne može tako da se inicijalizuje (može ako nije const).
[ Mrav @ 07.08.2003. 17:51 ] @
Pazi sta si uradio u inicijalizaciji niza. Izgleda da si definisao const pokazivač, a ne const članove. Proveri malo sintaksu, možda ovo pomogne.
[ Mrav @ 07.08.2003. 17:52 ] @
Eurekaa, viknu Arhimed iz kade i reče:

Evo rešenja, (trivijalnog).

u zaglavlju:
Code:

klasa{
static const float niz[3][3];
}

u .cpp fajlu:
Code:

const float klasa::niz[3][3] = {štagod,članova…};

Pazi ova posledna deklaracija mora biti u globalnom opsegu (ne u konstruktoru).

Leka je bio u pravu izgleda da nikako ne može da se inicijalizuje const ne static niz.

Ovo isprobano radi. Javi šta si uradio! može i na mail. A mogli bi i da se vidimo neki dan do kraja nedelje pošto ne radim pa da ti bar vratim onaj disk
[ leka @ 07.08.2003. 20:42 ] @
Mrave, ne volim plagijatore. :) Pogledaj kod koji sam poslao coveku u svom odgovoru i ne dupliraj stvari...
[ Mrav @ 07.08.2003. 21:40 ] @
Eee Leko, ne znaš u kojim sam ja jadan tripovima. Ja tvoj kod uopste nisam konstatovao, pa sam sam došao do istog rešenja (potpuno debilno gubljenje vremena), uostalom naznačio sam u postu da si bio u pravu, kada sam pri kraju njegovog pisanja uočio koji sam mentol |)
[ darkosos @ 08.08.2003. 06:51 ] @
Hm, da ali to je static, sto sam vec znao da moze ...
[ srki @ 08.08.2003. 06:57 ] @
Pa drugacije ne moze. Mora da bude static. A i da ne mora, zasto bi stavljao da ne bude static? Samo bi zauzimao memoriju bezveze.
[ headstrong @ 15.08.2003. 13:06 ] @
Samo jedno pitanje: "Zasto taj član mora biti const"? Da li postoji neka prednost u tome ili se samo kod "štiti" od zaboravnosti programera (ovo programera se ne odnosi ni na koga posebno već na čitavu branšu).
Kako se od skora bavim C++ i objektnim pristupom programiranju, zanima me da li moderni kompajleri umeju da kada napišemo const, stvarno naprave od toga npr. niz konstanti odn. tabelu u kodnom segmentu, ili se i dalje rezerviše memorijski prostor i niz konstanti inicijalizuje run-time.
[ Mrav @ 15.08.2003. 16:11 ] @
Modifikator const samo daje do znanja kompajleru da vrednost promenljive ne može da se menja u programu. Teoretski ne moraš da pišeš konst ako vodiš računa o tome da ne promeniš vrednost promenljive, ali nažalost to se nekada dešava i nehatom, tako da const modifikator osigurava da neku vrednost nećeš promeniti negde drugde u kodu ako si zamislio program tako da ona bude konstanta. Primetićeš da pokušaj promene const vrednosti dovodi do greške kompajlera a ne rada programa, u svakom slučaju pisati const kada je to potrebno je sigurno bolji stil nego pokušavati izbeći promenu vrednosti u programu (plus, što je možda i još važnije služi kao dokumentacija za drugog programera koji će čitati tvoj kod).
Tvoje drugo pitanje, nema velike veze sa const modifikatorom, a u stvari se odnosi na dinamički i statički alocirane objekte. Dinamičke alociraš u toku rada programa (veličina memorije koju oni zauzimaju stoga može biti promenljiva). A statički se alociraju jednom kada pokrećeš program i ne mogu se alocirati-dealocirati u toku njegovog rada. Vidi operatore new i delete u bilo kojoj knjizi o c++ da bi ti ovo postalo jasnije. Naravno očigledna je prednost dinamičke alokacije memorije, jedina je mana što dinamička alokacija memorije zahteva malo veći rad (veličinu statičke memorije lako možeš da predvidiš, dok "nestručna" dinamička alokacija memorije može da dovede i do takozvanog curenja (leak) memorije, što je ustvari pojava ne-dealociranja memorije (što je vraća na raspolaganje sistemu, koji je raspodeljuje i na druge programe ili opet na tvoj kod neke nove alokacije) naravno moraju se predvideti i uvesti izuzetci za slučaj da ne postoji dovoljno slobodne memorije za rad programa itd. itd.
[ leka @ 15.08.2003. 21:53 ] @
Citat:
Mrav:
Eee Leko, ne znaš u kojim sam ja jadan tripovima. Ja tvoj kod uopste nisam konstatovao, pa sam sam došao do istog rešenja (potpuno debilno gubljenje vremena), uostalom naznačio sam u postu da si bio u pravu, kada sam pri kraju njegovog pisanja uočio koji sam mentol |)


Aleksandre, ne moraš biti toliko oštar prema sebi, ja sam ono što sam rekao rekao iz zezanja... Mislim... nebitno je da li je neko nešto ponovio, bitno je da smo čoveku dali (valjda) dobre informacije/rešenja... :)
[ Mrav @ 16.08.2003. 15:14 ] @