Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  0 1600
Jeg lager et lite spill av noe slag i C++ og jeg sliter litt med pointere og references. Slik jeg har satt det opp, så har jeg en Entity klasse som holder på informasjon som x og y koordinater, hvilket symbol den skal ha, osv. Utover det så har jeg ting som Twig og Rock som er bygd oppå Entity. Jeg begynte med å ha en separat vector for hver eneste klasse men la fort merke til at det ble ganske tungvindt å måtte skrive ny kode for hver vector hvor det skulle trengtes når mesteparten av det bare blir repetisjon.

Nå har jeg gjort det slik at EntityManager (den som holder styr på sånt) har en vector for hvert objekt som er basert på Entity, samt en vector til som holder på pointere til Entity. Jeg fyller den vectoren med pointere til de forskjellige twigs og rocks som ligger i sine egne vectore. Det funker fint det og det gjør det mye mindre tidkrevende å skape nye klasser basert på Entity, men problemer oppstår når jeg skal legge disse referansene inn i vectoren som holder på Entity pointere.

Jeg har en funksjon som skaper entities og plaserer dem tilfeldig rundt på kartet. Om jeg bruker den funksjonen en gang for å skape Rocks f.eks så går det helt fint. Problemet oppstår når jeg bruker den funksjonen en eller flere ganger til. Om jeg la til 100 Rock den første gangen og 100 Twig den andre gangen, så vil de 100 nye elementene få den samme adressen som de første 100. For eksempel: element 0 har adresse 0x56263866cd10 og element 100 har også adresse 0x56263866cd10.

Slik jeg har forstått det, så er det pga. at compileren "resirkulerer" minnet og bruker samme adresse for de nye objektene. Spørsmålet er da, hvordan unngår jeg dette slik at pointerene peker til riktig objekt?

Her er funksjonen jeg nevnte ovenfor:

Kode

void EntityManager::add_rand_entity(const World& world, const int& amount, const EntityType& type)
{
    int rand_x {rand() % world.get_width()};
    int rand_y {rand() % world.get_height()};
    for (int i {0}; i < amount; ++i) {
        for (Entity* e : entities) {
            while ((rand_x == player.X() && rand_y == player.Y()) || (rand_x == e->X() && rand_y == e->Y())) {
                rand_x = rand() % world.get_width();
                rand_y = rand() % world.get_height();
            }
        }
        if (type == EntityType::Rock) {
            rocks.push_back(Rock{rand_y, rand_x, '@'});
            entities.push_back(&rocks.back());
        }
        else if (type == EntityType::Twig) {
            twigs.push_back(Twig{rand_y, rand_x, '/'});
            entities.push_back(&twigs.back());
        }
    }
}