25. september 2004 - 22:48Der er
15 kommentarer og 1 løsning
Allokering af hukommelse i klasse
Hey... er igang med et klassisk 'kryds og bolle' spil, for at udvikle mine ikke alt for gode C++ evner :) Jeg har allerede et funktionelt spil, men koden er langt fra køn, så jeg bestemte mig for at experimentere lidt med andre måder at gøre tingene på. Desværre er jeg løbet ind i et problem...
Jeg vil gerne gøre det muligt for spilleren at kunne bestemme brættets størrelse hver gang de starter et nyt spil. Jeg bruger et array til at representere brættet, og vil derfor gerne kunne ændre 'størrelsen' af det array dynamisk. Her er min hurtige test kode.
#include <cstdio> #include <cstdlib>
using namespace std ;
class game { public: void SetBoardSize( int nSize ) ;
private: int *board ; } ;
void game::SetBoardSize( int nSize ) { board = new int[nSize][nSize] ; }
int main( ) { return 0 ; }
Tag jer ikke af at den ser meget ufærdig ud :) Når jeg forsøger at compile denne kode, får jeg følgende fejl (bruger GCC under Linux).
main.cpp: I member function 'void game::SetBoardSize(int)': main.cpp:17: error: cannot convert `int (*)[((nSize - 1) + 1)]' to `int*' in assignment
Hvad er problemet? Prøvede at søge på google, men fandt kun et spm fra en anden med præcist samme problem, men intet svar. Skal siges at det er første gang jeg bruger 'new' så det er ganske muligt det bare er en eller anden latterlig begynder fejl :)
Og et halvt relateret spm... hvornår præcist udføres en klasses destructor? Jeg vil gerne placere den tilhørende 'delete' i klassens destructor, men er usikker på hvornår det så bliver udført.
int main() { int n = 2; int m = 3; int *a = new int[n*m]; init1(a,n,m); show1(a,n,m); int **b = new (int *)[n]; for(int i=0; i<n; i++) b[i]=new int[m]; init2(b,n,m); show2(b,n,m); twodim *c = new twodim[2]; init3(*c,n,m); show3(*c,n,m); }
#1 = simulation af 2D array via 1D array #2 = array af array #3 = fusker trick som jeg ikke engang er sikker på virke med alle compilere (men g++ æder den)
Interresant, den skal jeg lige tygge lidt på tror jeg :)
Tænker lidt på om der kunne være andre måder at opnå samme resultat... måske slet ikke bruge et 2D array, men måske noget tilsvarende. Kan ikke lige komme på hvad det skulle være, men man ved jo aldrig.
Hmm, der var den igen... vektor :) Jeg synes hele tiden jeg finder adskillige forskellige definitioner af hvad en vektor er, burde nok snart tage mig sammen og få ordentlig styr på det.
Indtil da tror jeg jeg holder mig til arrays :) Men tak for eksemplerne, vil prøve at lege lidt frem og tilbage, og se hvad der føles bedst. Lægger du et svar arne?
int a[10]; // statisk = størrelse bestemt på compile time int *a = new int[10]; // dynamisk = størrelse bestemt på runtime, men fast efter new vector<int> a; // total dynamisk = udvides hele tiden automatisk efter behov
"men fast efter new", vil det sige jeg kun kan "forstørre" det én gang? I så fald vil det jo alligevel ikke være optimalt i dette tilfælde. Så skal jeg enten bruge en vektor, eller fastsætte mit array til den maximale størrelse og kun bruge en del af det. Har jeg ret?
I rigtigt mange tilfælde kender du den præcise størrelse når du laver new.
Men hvis ikke du gør det så er vector en god løsning.
Alternativerne er enten som du skriver at allokere en max. størrelse (og så er det sjove ligesom gået af det dynamiske) eller at allokere N og når man så skal bruge mere så allokerer man et nyt array N+N og kopierer alt data fra det første til det nye og frigiver det første (og det er lidt bøvlet).
Hmm, ja det kan hurtigt gå hen og blive rigtigt bøvlet, specielt for sådan et simpelt spil :)
Jeg tror ind til videre jeg vil bruge et statisk array, og så kan jeg jo altid udskifte det med en vector eller noget andet senere. Sommetider er det bedst at få skidtet til at virke først, og så gå i dybden med detaljerne bagefter :) Men tak for hjælpen, nu har jeg lidt at spekulere over mens jeg koder videre.
Så tror jeg endelig jeg fandt en optimal løsning. Har valgt at bruge vectors, og efter lidt søgning på google fandt jeg en smart kode så jeg nu kan arbejde med min "2D vector" som var den et dynamisk 2D array. Tilsyneladende bliver det ikke meget bedre :)
Her er min hurtige test kode
class board { public: // Constructor board( ) { }
board( int row, int col ) : vBoard( row ) { for( int i = 0 ; i < row ; i++ ) { vBoard[i].resize( col, 0 ) ; } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.