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?
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.
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.
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.
Pitäisi varmaan olla Ammus* olio[500]
TsaTsaTsaa kirjoitti:
Pitäisi varmaan olla Ammus* olio[500]
Koodissa on noin, mutta en muistanut nyt tuota...
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; } }
Kiitos, nyt toimii hyvin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.