Re: ABS & Funktioner
Alpha II skrev:
...Jag har klassen CObject som är en abstrakt basklass. CSpaceship och CAsteroid ärver av CObject.
De helt virituella funktionerna Update och Draw och några variabler är det enda som finns i CObject.
I CSpaceShip finns några fler funktioner som inte finns i CObject.
Nu har jag en funktion som jag kallar Collision som tar två CObjects som argument.
Den funktionen vill jag kunda använda med olika kombinationer av CSpaceShip och CAsteroid. Tex Collision(spaceship[10], asteroid[5]) ..... Collision(spaceship[10],spaceship[1])
Problemet är att när jag använder en funktion i någon av klasserna kraschar programmet. Har ingen aning varför. Jag är ganska ny i C++ och har fortfarande lite problem med klasser och pekare. Kan det vara att jag skapar objekten fel? Så är definerar jag asteroiderna och rymdskeppena. Rätt?
CObject * players = new CSpaceShip[MAX_PLAYERS];
CObject * asteroids = new CAsteroid[MAX_ASTEROIDS];
För det första tycker jag att din deklaration ser lite skum ut. Vad vill du att players ska vara?
En pekare till en Array med CSpaceShips deklareras:
CObject (* players)[] = new CSpaceShip[MAX_PLAYERS];
Om du däremot vill ha en array med (pekare till CSpaceShips):
CObject * players[] = new CSpaceShip[MAX_PLAYERS];
Det är möjligt att det går att skriva som du har gjort, men jag är tveksam till vad du får i så fall?
***
Sedan om det du har funkar så har du troligen en pekare till en array. I så fall kommer players[k] att vara en pekare till det k:e CObject:et i Arrayen. För att komma åt funktionen i det objekt som pekaren pekar på, måste du skriva:
players[k]->Draw() vilket är en kortform för (*players[k]).Draw() dvs du måste först avreferera pekaren så du når objektet själv.
Dessutom räcker det inte med att du har gjort new, om du inte har stoppat in något objekt på indexplats 5 t.ex. så kommer players[5] att peka på godtycklig plats i minnet. Där kan stå precis vad som helst.
***
Slutligen: De enda funktionerna du kommer åt i såväl CSpaceShip som i CAsteroid är de som finns med i gränssnittet till CObject.