Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problemi sa linkanom listom i polimorfizmom

[es] :: C/C++ programiranje :: problemi sa linkanom listom i polimorfizmom

[ Pregleda: 1703 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sendai

Član broj: 98530
Poruke: 65
*.adsl-mo.bih.net.ba.



Profil

icon problemi sa linkanom listom i polimorfizmom06.01.2007. u 21:38 - pre 210 meseci
Ako netko ima volje da pogleda ovaj kod.


Code:

#include <iostream>
using namespace std;

class GrafObjekt;
//------------------------------------------------------------
// KLASA Atom, nju nasljedjuje klasa "GrafObjekt" 

class Atom {
private:
    Atom *pokSljedeci, *pokPrethodni;
public:
    Atom *Sljedeci () { return pokSljedeci; }
    Atom *Prethodni () { return pokPrethodni; }
    void StaviSljedeci ( Atom *pok ) { pokSljedeci = pok; }
    void StaviPrethodni ( Atom *pok ) { pokPrethodni = pok; }
    virtual ~Atom(){}

};

//-------------------------------------------------------------
// KLASA Lista SADRZI FUNKCIJE ZA PUNJENJE I BRISANJE LISTE

class Lista {
private:

    Atom *glava, *rep;
public:
    Lista():glava(NULL),rep(NULL){}
    virtual ~Lista(){}
    Atom *AmoGlavu() {return glava;}
    Atom *AmoRep() { return rep;}
    void UgurajClan(Atom *pok, Atom *IzaKojeg=NULL); // PUNI LISTU
    void BrisiListu(); // BRISE LISTU
    
};

void Lista:: UgurajClan(Atom *pok, Atom *IzaKojeg) {
    if(IzaKojeg!=NULL) {
        if(IzaKojeg->Sljedeci()!=NULL) {
            IzaKojeg->Sljedeci()->StaviPrethodni(pok);}
        else
            rep=pok;
        pok->StaviSljedeci(IzaKojeg->Sljedeci());
        IzaKojeg->StaviSljedeci(pok);
    }
    else {
        pok->StaviSljedeci(glava);
        if(glava!=NULL) {
            glava->StaviPrethodni(pok);
        }
        
        glava=pok;
    }
    pok->StaviPrethodni(IzaKojeg);
}

void Lista::BrisiListu() {
    Atom *temp=glava,*temp1=0;

    while(temp) {
        temp1=temp;
temp=temp->Sljedeci();
delete temp1;
    }
//---------------------------------

enum Tboja {BIJELA,CRNA,ZELENA,ZUTA,BEZ,NARANCASTA};
//----------------------------------------------------------
// VIRTUALNA KLASA GrafObjekt NASLJEDJUJE KLASU Atom

class GrafObjekt:public Atom {
private:
    Tboja Boja;
public:
    void PostaviBoju(Tboja nova) {Boja=nova;}
    Tboja CitajBoju() { return Boja;}
    virtual void Crtaj(){}
    virtual void Brisi() {}
    virtual void Translatiraj(int,int){}
    void Pomakni (int px=0,int py=0);
    
    virtual ~GrafObjekt(){ cout << "GrafObjekt destruktor\n";}
};

void GrafObjekt::Pomakni(int px, int py) {
    Brisi();
    Translatiraj(px,py);
    Crtaj();
}
//------------------------------------- 
//SLIJEDE NEKE JEDNOSTAVNE KLASE KOJE NASLJEDJUJU KLASU GrafObjekt
class linija:public GrafObjekt {
public:
    linija(int a=0,int b=0){}
    void Translatiraj(int px,int py) {
        cout << "translatiraj " << px << " " << py << "\n"; }
    void Brisi() { cout << "Brisi\n";}
    void Crtaj() { cout << "Crtaj\n"; }
    virtual ~ linija(){ cout << "linija destruktor\n";}
};
//-------------------------------------
class tocka:public GrafObjekt{
public:
    tocka(int a=0,int b=0){}
    void Translatiraj(int px,int py) {
        cout << "..................... " << px << " " << py << "\n"; }
    void Brisi() { cout << "Brisi............\n";}
    void Crtaj() { cout << "Crtaj.....................\n"; }
    virtual ~tocka(){ cout << "tocka destruktor\n";}
};
//------------------------------------------
class elipsa:public GrafObjekt{
public:
    elipsa(int a=0,int b=0){}
    void Translatiraj(int px,int py) {
        cout << "ELIPSE " << px << " " << py << "\n"; }
    void Brisi() { cout << "Brisi ELIPSE\n";}
    void Crtaj() { cout << "Crtaj ELIPSE\n"; }
    virtual ~elipsa(){ cout << "elipsa destruktor\n";}
};
//*****************************************************************


int main() {

Lista lista;

// slijedi punjenje liste

lista.UgurajClan(new linija);
lista.UgurajClan(new elipsa);
lista.UgurajClan(new tocka);
lista.UgurajClan(new linija);

// ovdje ide trazena funkcija

lista.BrisiListu(); // brisanje

return 0;
}


Imam klasu "GrafObjekt" koja ima virtualne funkcije "Crtaj(), Brisi() i Translatiraj(int,int),
nju nasljedjuju tri klase "Linija", "Tocka" i "Elipsa", a ona sama nasljedjuje klasu "Atom".
Pomocu objekta klase "Lista" punim listu tako sto alociram dinamicku memoriju za objekte klasa koji nasljedjuju klasu "GrafObjekt".

Sam kod je dobar, medjutim trebam(a ne znam) napisati funkciju koja ce ici kroz listu i za svaki objekt liste pozvati odgovarajucu virtualnu funkciju npr. Crtaj().

Unaprijed hvala.
 
Odgovor na temu

1jedini
Dejan Milosavljevic
BG

Član broj: 102721
Poruke: 74
212.200.119.*



Profil

icon Re: problemi sa linkanom listom i polimorfizmom07.01.2007. u 10:17 - pre 210 meseci
npr:

Code:

 for(Atom* a=lista.glava; a != lista.rep; a=a.Sljedeci () )
  {
   GrafObjekt *g=dynamic_cast<GrafObjekt *>(a);
   if( NULL != g ) g->Crtaj();
  }


Gornji kod je prilicno nazvrljan.
Fali jos par stvari, ali poenta je prisutna.

stl varijanta

Code:

typedef std::list<Atom*> AtomLista;
AtomLista lista;

lista.push_back(new linija);
lista.push_back(new elipsa);
lista.push_back(new tocka);
lista.push_back(new linija);

 for(AtomLista::iterator a=lista.begin(); a != lista.end(); ++a  )
  {
   GrafObjekt *g=dynamic_cast<GrafObjekt *>(*a);
   if( NULL != g ) g->Crtaj();
  }

 for(AtomLista::reverse_iterator ar=lista.rbegin(); ar != lista.rend(); ++ar  )
  {
   delete *ar;
  }



Nedostajali su r-ovi.
Za reverse_iterator begin je rbegin a end je rend.




[Ovu poruku je menjao 1jedini dana 07.01.2007. u 22:04 GMT+1]
AKA DDMM
 
Odgovor na temu

sendai

Član broj: 98530
Poruke: 65
*.adsl-mo.bih.net.ba.



Profil

icon Re: problemi sa linkanom listom i polimorfizmom07.01.2007. u 12:04 - pre 210 meseci

Puno hvala majstore!
 
Odgovor na temu

[es] :: C/C++ programiranje :: problemi sa linkanom listom i polimorfizmom

[ Pregleda: 1703 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.