Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Taulukko jossa on usean luokan olioita

KoodiNoppa [08.02.2008 00:08:13]

#

Ohjelmassani on hieman tämän tapainen koodinpätkä:

class kantaluokka
{
   private:
   int numero;
   public:
   virtual int anna_numero()=0;
};
class luokka: public kantaluokka
{
   public:
   int anna_numero(){return numero;}
};
class luokka2: public kantaluokka
{
   public:
   int anna_numero(){return 2*numero;}
};

Miten saan tehtyä taulukon/vektorin, joka sisältää molempien luokkien olioita ja jonka alkioiden tyypin voi vaihtaa (kantaluokasta periytyvien jäsenmuuttujien ei tarvitse pysyä samana tyyppiä vaihdettaessa)?

koo [08.02.2008 00:52:45]

#

Lyhyesti: Et mitenkään. Taulukossa/vektorissa voi olla vain samaa tyyppiä olevia olioita.

Pitemmin: Käytä osoittimia.

std::vector<kantaluokka *> taulukko;

Tyypin vaihtotoive vaikuttaa jonkinlaiselta suunnitteluvirheeltä. Tällä pääsee alkuun, mutta luultavasti edessä on loputon suo.

class kantaluokka
{
   protected:
   int numero;
   public:
   virtual int anna_numero()=0;
   virtual kantaluokka *toisenlainen()=0;
};
class luokka: public kantaluokka
{
   public:
   int anna_numero(){return numero;}
   luokka2 *toisenlainen { return new luokka2(); }
};
class luokka2: public kantaluokka
{
   public:
   int anna_numero(){return 2*numero;}
   luokka *toisenlainen { return new luokka(); }
};

Sitten on vielä mainittava, että dynamic_castin ja iffien käyttö on vielä huonompi vaihtoehto. Pääsääntöisesti olioiden tyyppiä ei kuulu joutua tarkastelemaan niiden ulkopuolelta.

Teuro [08.02.2008 11:08:08]

#

Voisiko nuo kaksi luokkaa yhdistää antamalla toiselle funktiolle erilaisen nimen? Tuntuu aika eksoottiselta tehdä kaksi luokkaa, joilla on erona yksi funktio. Tietenkin oikea toteutus on erilainen kuin tämä esimerkki. Asiassa voisi auttaa, jos tietäisi mitä noilla luokilla on tarkoituksena tehdä. Suunnitteluvirhe voisi paljastua ja ongelma saada säällisen päätöksen.

Tämä nyt on vain ehdotus.

KoodiNoppa [08.02.2008 13:50:55]

#

Myönnän, että vaihdettava tyyppi oli outo toive. Niin siinä käy kun väsyneenä kirjottelee : )
Luokkien yhdistäminen voi haitata myöhempien laajennuksien toteutusta, näillä tietotaidoilla ainakin. Tai sitten ei. Kun tarkemmin ajattelen, se voisi olla ratkaisu muutamaan ongelmaan... Takaisin suunnitteluvaiheeseen.
Kiitos avusta!

Vastaus

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

Tietoa sivustosta