Monitasoisen säiliöluokan toteuttaminen

The Real J.

Eräässä työprojektissa työstettävään softaan (Visual C :lla tehtävä Windows-sovellus) pitäisi lisätä tietynlainen säiliösysteemi. En voi kertoa tarkkaa tietoa tuosta (salaista tietoa), mutta periaate menee seuraavasti:

-Alimmalla tasolla on luokka A, joka sisältää pelkkää kiinteää tietoa: käyttäjälle näkyvä instanssin nimi (CString) ja muutama numeroarvo taulukossa. Sekä tietenkin metodit luokan käsittelyyn.

-Seuraavalla tasolla on luokka B, joka voi sisältää vaihtelevan määrän luokan A instansseja, sekä kyseisen instanssin nimen (jälleen käyttäjälle näkyvä, CString). Ja metodit luokan käsittelyyn.

-Ylimmällä tasolla on vaihtelevan kokoinen säiliö luokan B instansseja, joka saatetaan toteuttaa omana luokkanaan, jos siihen tulee merkittävästi uusia toimintoja. Tätä tietorakennetta on tarkoitus käyttää tietolähteenä eräälle dialogille, jossa tietoja muokataan. Käytännössä siis varsinaiset muokattavat tiedot sijaitsevat luokassa A.

Koska luokassa B ja ylimman tason tietorakenteessa säiliön koko on vaihteleva uskon olevan parasta käyttää STL-standardisäiliöitä. Ja koska niitä tullaan indeksoimaan valitsin vector-luokan. Säiliöön tallennetaan kyseisten luokkien instanssien osoitteet, jotka saadaan new-funktiolla luoduista instansseista. Eli luokassa B on määritelty jäsen

vector m_jotain;

Ylemmän tason tietorakenteisiin on tarkoitus liittää metodi, jolla saadaan haettua luokan säiliöstä tietyn elementin osoitin, jotta voidaan käyttää alemman luokan metodeita.

Pari kysymystä tuohon liittyen:

1. Onko kyseinen tapa järkevä, vai pitäisikö tehdä toisella tavalla ?
2. Jos instanssit luodaan new-operaattorilla ja liitetään vektoriin push_back-operaattorilla, miten pitää menetellä kun destruktorissa tyhjennetään vektori ? Pitääkö suorittaa jokaiselle elementille sekä erase (poistetaan vektorista) että delete (vapautetaan muisti), vai riittääkö vain toinen niistä. Ja jos molemmat pitää suorittaa, miten se pitäisi tehdä ?

J.

5

232

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Vasenjalkainen

      Kyllähän tuo onnistuu, destruktorissa täytyy loopata vektorin läpi ja tuhota oliot ja sen jälkeen tyhjentää vektori.

      Kannattaa tosin olla tarkkana jos ajon aikana poistetaan vektorista yksittäisiä elementtejä tai tuhotaan vektoriin tallennettuja olioita, ettei vektoriin jää viittauksia tuhottuihin olioihin tai vektorista poisteta viittausta vielä olemassaolevaan olioon.

      • The Real J.

        ensin tuhotaan oliot deletellä ja sen jälkeen poistetaan vektorista erasella ?

        Eli tähän tyyliin:

        vector::iterator it;

        for (it = foo.begin() ; it != foo.end() ; it )
        {
        delete it;
        foo.erase(it);
        }

        ja jos haluaa jossain välissä poistaa tietyn alkion, esmes kolmannen elementin:

        delete (foo.begin() 2);
        foo.erase(foo.begin() 2);

        vai ?


      • Tyhjentäminen
        The Real J. kirjoitti:

        ensin tuhotaan oliot deletellä ja sen jälkeen poistetaan vektorista erasella ?

        Eli tähän tyyliin:

        vector::iterator it;

        for (it = foo.begin() ; it != foo.end() ; it )
        {
        delete it;
        foo.erase(it);
        }

        ja jos haluaa jossain välissä poistaa tietyn alkion, esmes kolmannen elementin:

        delete (foo.begin() 2);
        foo.erase(foo.begin() 2);

        vai ?

        Muuten kyllä mutta pari virhettä:

        A) Älä poista alkioita vektorista loopin aikana koska se sotkee silmukan.

        B) Delete poistaa itse iteraattoriosoittimen, ei oliota joka sen takana on, eli yksi tähti eteen.

        for (...) { delete *it; }

        foo.clear();
        // tyhjentää koko vektorin yhdellä komennolla


      • The Real J.
        Tyhjentäminen kirjoitti:

        Muuten kyllä mutta pari virhettä:

        A) Älä poista alkioita vektorista loopin aikana koska se sotkee silmukan.

        B) Delete poistaa itse iteraattoriosoittimen, ei oliota joka sen takana on, eli yksi tähti eteen.

        for (...) { delete *it; }

        foo.clear();
        // tyhjentää koko vektorin yhdellä komennolla

        Okei, mutta jos haluan poistaa vain yksittäisen alkion voiko sen tehdä tyyliin:

        delete foo[2];
        foo.erase(foo.begin() 2);

        Äkkiseltään ajateltuna tuon pitäisi toimia. Vektoriinhan tallennetaan osoittimia olioihin ja delete haluaa myös osoittimen.


      • Vasenjalkainen
        The Real J. kirjoitti:

        Okei, mutta jos haluan poistaa vain yksittäisen alkion voiko sen tehdä tyyliin:

        delete foo[2];
        foo.erase(foo.begin() 2);

        Äkkiseltään ajateltuna tuon pitäisi toimia. Vektoriinhan tallennetaan osoittimia olioihin ja delete haluaa myös osoittimen.

        Tuo toimii, vektori[x] antaa suoraan tallennetun objektin, toisin kuin iteraattori.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Putin hoiti Suomen natoon ja myös Ruotsin

      Iso kiitos Vladimir Putinille. Hänen ansiosta pääsemme nyt Natoon. Putin halusi Naton lähelle ja nyt sai. Voimme tästä kiittää vain Putinia.
      Maailman menoa
      646
      7936
    2. Niinistö teki hetkessä Suomesta Venäjän ydinaseiden maalitaulun

      Kaiken lisäksi mies vielä lällätteli Putinille eilisessä tiedotustilaisuudessa ja käski katsomaan itseään peiliin. Kyllä vähän asiallisempaa käytöstä
      Maailman menoa
      466
      2220
    3. Voi Stefu ja sun kiivas luonteesi

      Sielä lentelee ullakkohuoneiston ikkunasta daamin vaatteet ja matkalaukut pitkin pihaa. Toisaalta,en ihmettele yhtään että tämä suhde päättyi näin,kyl
      Kotimaiset julkkisjuorut
      229
      2124
    4. Poliisi otti Stefun kiinni!

      Seiska tietää kertoa.
      Kotimaiset julkkisjuorut
      144
      1696
    5. Veikkaus: Miten The Rasmus pärjää Euroviisuissa?

      Euroviisuhuuma on ylimmillään, kun Suomi ja The Rasmus taistelee biisillään Jezebel. Bändi on tikissä, kunhan Lauri Ylösen ääni kantaa. Mitä veikka
      Viihde ja kulttuuri
      51
      1229
    6. Ohhoh! Martina Aitolehti ja seurapiirihurmuri-Jesper ekassa yhteiskuvassa - Sutinaa Mallorcalla!

      Martina Aitolehti ja seurapiirijulkkis-Jesper nauttivat toisistaan varsin vauhdikkaissa merkeissä Mallorcalla. Aitolehti ei ole esitellyt rakastaan vi
      Kotimaiset julkkisjuorut
      25
      1218
    7. Stefanilta tuli taas karu totuus Sofiasta

      Marokkolainen h*o*ra! Voi tsiisus kun mulla on hauskaa! Lumput lentää ikkunasta kun Stefu raivoaa h*uralleen🤣🤣🤣 Nyt ne popparit tulille, tästä tule
      Kotimaiset julkkisjuorut
      99
      1103
    8. Ootko onnellinen kun ei tarvitse

      nähdä tätä tyhmää naamaa enää koskaan? Multa se särkee sydämen, mutta minkäs teen. Vaikka olisi kuinka sinnikäs eikä hellittäisi, se ei aina auta.
      Ikävä
      65
      834
    9. Steppuli veressä

      Seiskan lööpissä Steppulilla naama ja nyrkit veressä. Ei tainnut ihan kamojen pihalle paiskominen riittää. Onkohan pistänyt kämpän tuusannuuskaks.
      Kotimaiset julkkisjuorut
      55
      751
    10. Oletko nähnyt eroottiset kohuleffat? Fifty Shades Of Grey -trilogia tv:stä

      Fifty Shades -trilogia starttaa, kun nuori opiskelijanainen Anastasia tapaa rikkaan liikemiehen. Seksisuhdehan siitä starttaa, höystettynä sadistisill
      Suhteet
      7
      727
    Aihe