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

244

    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. Vesikin maksaa, miksei hengitysilma?

      Jatkuvasti itketään ettei ole rahaa mihinkään, mutta tilastojen mukaan rahaa on enemmän kuin koskaan, joten miksei asial
      Maailman menoa
      28
      1828
    2. Satuolennoista tarinointi ei kuulu peruskoulun tehtäviin

      Opetustunteja on muutenkin käytössä vain rajallinen määrä. Eli nämä satuhommat koulun ulkopuolelle vapaaehtoisiin harras
      Maailman menoa
      157
      1802
    3. Suomalainen perheenisä vaatii Suvivirren esittämisestä hyvityksiä

      Itse lapsena uskonnonopetuksesta vissiin traumoja saanut ihka suomalainen (!) perheenisä vaatii Espoon kaupungilta korva
      Maailman menoa
      350
      1545
    4. Mitä haluaisit

      Tehdä kaivattusi kanssa?
      Ikävä
      145
      1160
    5. Mies profiloin sinut

      Etsit täysin hallittavaa mutta samalla poikkeuksellista ihmistä. Etsit jotain mitä et koskaan tule saamaan.
      Ikävä
      213
      1154
    6. Lahkokasteen ja kristillisen kasteen erot

      Raamatun mukaan Kristillisessä yhdessä kasteessa Jumala pesee ja puhdistaa ihmisen sydämen ja poistaa perisynnin kirouks
      Kaste
      422
      1128
    7. Salainen kastekoulutus

      Millainen on helluntailainen kastekoulutus ja kauanko se kestää ?
      Kaste
      285
      995
    8. Känsäkoura ja hotelli

      Tietoa kuka ostanut?
      Kuhmo
      11
      995
    9. Heikki Paasosen Marita-vaimo jätti tunteikkaat jäähyväiset: "Tällä kertaa me..."

      Heikki Paasonen on naimisissa Marita Paasosen (os. Alatalo) kanssa ja heillä on kaksi pientä lasta. Nyt koitti aika jätt
      Suomalaiset julkkikset
      4
      979
    10. Pirkanlinna yleisötapahtuma

      Oli todella hyvä tilaisuus. Ja EERO. L. Aivan mahtava tyyppi. Veti rennosti ja asiallisesti. Ja yleisöltä hyviä kysymyks
      Ähtäri
      49
      938
    Aihe