Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL: Olioiden tuhoaminen

Sivun loppuun

erakko- [27.11.2008 12:10:42]

#

Okei, tässä käytän nyt taulukkoja, mutta yritän siirtyä jatkossa listojen käyttöön.

Elikkä, haluan jossain tietyssä tilanteessa tuhota taulukossa sijaitsevan olion, otetaan esimerkiksi vaikka tietynlainen törmäys, paikka, tai shootterissa ammus. Ajattelin ratkaisua:

delete olio[i];
olio[i] = NULL;

...mutta tämä ei toimi, vaan antaa Segmentation Faultin. Kyllä, laitoin myös ehdon jossa ensin tarkistetaan onko olio NULL vai ei. Huomatkaa "delete", eli oliotaulu on dynaaminen.

Vai toimisko ratkaisu, jossa yhdellä muuttujalla testataan onko olio "tuhoutunut", ja jos on, kuvaa ei piirretä ja metodeita ei käydä läpi?

Grez [27.11.2008 12:17:50]

#

Ja olet luonut kunkin olion erikseen?

Siis tyyliin joko...

Olio *oliotaulu[2];
oliotaulu[0] = new Olio();
oliotaulu[1] = new Olio();

//hommailut

delete oliotaulu[0];
delete oliotaulu[1];

...tai...

Olio *oliotaulu;
oliotaulu = new Olio [2];

//hommailut

delete [] oliotaulu;

...mutta ei ristiin.

erakko- [27.11.2008 12:22:13]

#

Grez kirjoitti:

Ja olet luonut kunkin olion erikseen?

En. Kuten sanoin, se on oliotaulukko. En tiedä jos se sitten on "olioiden luomista erikseen". Tai oikeastaan kyllä...

Ammus olio[500] = {NULL};
//for jossa "olio[i] = new Ammus(parametrit)"

Eli tuo ensimmäinen mutta forin avustuksella.

Teuro [27.11.2008 12:24:01]

#

Ja et tietenkään yli- / ali-indeksoi taulukkoa? taulukko alkaa 0:a ja sen viimeinen laillinen alkio on koko-1, mutta tämä oli sulle varmaankin selvää? Olethan luonut jokaisen olion new-operaattorilla, koska muutoin delete ei ole oikea tapa tuhota oliota.

TsaTsaTsaa [27.11.2008 12:25:16]

#

Pitäisi varmaan olla Ammus* olio[500]

erakko- [27.11.2008 12:27:35]

#

TsaTsaTsaa kirjoitti:

Pitäisi varmaan olla Ammus* olio[500]

Koodissa on noin, mutta en muistanut nyt tuota...

Metabolix [27.11.2008 13:00:24]

#

Kannattaa harkita vakavasti standardikirjaston hyödyntämistä. Hatusta vedettyä:

#if 1
  // vektorilla
  #include <vector>
  typedef std::vector<Ammus> Ammukset;
#else
  // tai listalla
  #include <list>
  typedef std::list<Ammus> Ammukset;
#endif

Ammukset ammukset;
Ammukset::iterator ammus;

// Lisätään ammus
ammukset.push_back(Ammus(parametrit));

// Käydään läpi ammukset.
for (ammus = ammukset.begin(); ammus != ammukset.end(); ++ammus) {
  ammus->toimi();
  // Ammus *a = &*ammus; // Jos välttämättä tarvitset johonkin
}

// Käydään uudestaan läpi ja tuhotaan tarvittaessa. Voisihan tämän samassakin silmukassa tehdä... Huomaa ++ammus ehtolauseessa, jotta päästään seuraavaan silloinkin, kun ei tuhota mitään!
for (ammus = ammukset.begin(); ammus != ammukset.end();) {
  if (ammus->tuhottava) {
    // tuhotaan ammus ja otetaan tilalle seuraava (tulee paluuarvona)
    ammus->vapauta_data();
    ammus = ammukset.erase(ammus);
  } else {
    // siirrytään seuraavaan
    ++ammus;
  }
}

erakko- [27.11.2008 22:18:54]

#

Kiitos, nyt toimii hyvin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta