[ Slave_82 @ 13.06.2008. 13:06 ] @
OK, moram da zavrsim domaci iz c++ koji ne bi trebao da bude preterano tezak ali neke stvari mi nisu jasne.

Zadatak je sledeci: klasa Predmet koja ima neku velicinu, iz nje izvedena klasa UporedljiviPredmet koja ima virtuelne metode za poredjenje velicine predmeta i iz nje izvedena klasa Artikal koja poredi imena artikala. E sad takodje postoji i klasa Zbirka koja predstavlja listu Predmeta. Klasa UredjenaZbirka je sortirana lista predmeta a klasa Skladiste je sortirana lista Artikala. E sad moj problem je sledeci, napravio sam klase Predmet, UporedljiviPredmet, Artikal i Zbirka i to sve lepo radi, medjutim zanima me kako da odradim (i da li moze uopshte) da klasa UredjenaZbirka nasledi klasu Zbirka posto koristi drugi tip podatka (UporedljiviPredmet) tako da sve one metode pisane za prvobitnu klasu ne rade.

Ja mogu da napravim da to radi bez ikakvog nasledjivanja (3 liste, svaka koristi razlicit predmet) ali u sustini pisem isti kod 3 puta samo sa drugacijim tipovima podataka. Ne znam, mozda nisam bio najjasniji ali ako neko ima neku ideju ili bilo kakav savet hvala unapred. Poz
[ karas @ 13.06.2008. 14:20 ] @
Zbirka radi sa klasom Predmet, samim tim radi i sa UporedljiviPredmet jer UporedljiviPredmet jeste i Predmet. Samim tim ce i UredjenaZbirka prilikom nasledjivanja klase Zbirka raditi sa Predmet i UporedljiviPredmet. Npr.
Code:

class Predmet
{
public:
        Predmet() {}
};


class UporedljiviPredmet : public Predmet
{
public:
        UporedljiviPredmet() {}
};


class Zbirka
{
private:
        Predmet p[10];
public:
        Zbirka() {}
};


class UredjenaZbirka : public Zbirka
{
public:
        UredjenaZbirka() {}
};

Dakle, klasa UredjenaZbirka (kao i Zbirka) ce raditi sa obe Predmet i UporedljiviPredmet.
(Naravno, ostaje problem drzanja objekata jer ovako ce dolaziti do staticke konverzije i virtuelne funkcije se nece pozivati, pa treba baratati sa objektima na heapu.)
Da li si zeleo ovako nesto ili hoces da UredjenaZbirka radi samo sa UporedljiviPredmet a Zbirka samo sa Predmet i jos da se nasledjuju?
[ deerbeer @ 13.06.2008. 15:37 ] @
Ako sam te dobro razumeo napravis klasu Zbirka koja ce sadrzati listu bazne klase Predmet
A posle toga samo nasledjujes Zbirka klasu kako bi imao odredjen tip sortinga u njoj
Code:


class Zbirka
{
private:
        std::vector<Predmet*> predmeti ; 
public:
     Zbirka() {predmeti.resize(100) ; } // npr. napravis 100 elemenata 
      void add (Predmet* pPredmet) {
         predmeti.push_back(pPredmet) ;
     } 
};
class UporedlljivaZbirka : public Zbirka 
{
public : 
  UporedlljivaZbirka (): Zbirka() {}  
  void SortByUporedljiviPredmet () ; 

    
} ; 
class Skladiste : public Zbirka 
{
public : 
    Skladiste () : Zbirka () { } 
    void SortByArtikal () ; 

} ; 



Negde u tvom kodu :

Code:


UporedlljivaZbirka UPLista ; 
Predmet * pUporedPredmet= new UporedljiviPredmet() ; 
UPLista.add(pUporedPredmet) ; 


Skladiste skladiste  ; 
Predmet * pArtikal= new Artikal() ;
skladiste.add(pArtikal) ; 


[ Slave_82 @ 13.06.2008. 16:16 ] @
Hvala na odgovorima probacu da ovo odradim, moram malo da prilagodim kod.

Npr Zbirka izgleda ovako

Code:


class Zbirka{

protected:
       struct Elem{
              Predmet predmet; Elem* sled;
              Elem(Predmet& pr){ predmet = pr; }

     };

    Elem* prvi;

public:

Zbirka(){ prvi = NULL; }

//Metode koje dodaju element u listu, izlistavanje itd...

};




E sad ja nemam predstavu kako da izvedem klasu UredjenaZbirka koja ce da bude sortirana zato sto klasa Predmet nema metode za uporedjivanje velicine. Koliko ja shvatam ona mora da radi sa klasom UporedljiviPredmet. I tu nastaje problem...nije mi jasno kako to da izvedem...pogotovu sto ne baratam sa listama preterano dobro. U svakom slucaju hvala, probacu, nisam znao da mogu da uradim Predmet * pr = new UporedljiviPredmet(), mozda je u tome caka.
[ deerbeer @ 13.06.2008. 17:42 ] @
Citat:

E sad ja nemam predstavu kako da izvedem klasu UredjenaZbirka koja ce da bude sortirana zato sto klasa Predmet nema metode za uporedjivanje velicine. Koliko ja shvatam ona mora da radi sa klasom UporedljiviPredmet. I tu nastaje problem...nije mi jasno kako to da izvedem...pogotovu sto ne baratam sa listama preterano dobro. U svakom slucaju hvala, probacu, nisam znao da mogu da uradim Predmet * pr = new UporedljiviPredmet(), mozda je u tome caka.


Naravno da mozes ...u tome je i sustina polimorfizma tj. nasledjivanja ....
U klasi UporedlljivaZbirka implementiraj sortiranje zasnovano na virtualnom operatoru poredjenja iz UporedljiviPredmet

Code:
 

#include <vector> 
using namespace std ; 

class UporedljiviPredmet : public  Predmet 
{
public :
   UporedljiviPredmet () : Predmet() {} 
   virtual bool operator ==  (UporedljiviPredmet & rhs){} //ovde implementiraj poredjenje 
   virtual  bool operator != (UporedljiviPredmet & rhs) {}  //ovde implementiraj poredjenje 

} ;

class Zbirka
{
private:
        std::vector<Predmet*> predmeti ; 
     // mozes koristiti i svoju strukturu Elem .. ja sam stavio vector zbog pojednostavljenja 
public:
      Zbirka(int size) {predmeti.resize(size) ; } // npr. napravis 100 elemenata 
      void add (Predmet* pPredmet) {
         predmeti.push_back(pPredmet) ;
     } 
};

class UporedlljivaZbirka : public Zbirka 
{
public : 
  UporedlljivaZbirka (): Zbirka() {}  
  
  void SortByUporedljiviPredmet ()  
  { 
      UporedljiviPredmet * p0 = (UporedljiviPredmet*)predmeti.at(0);  
      UporedljiviPredmet * p1 = (UporedljiviPredmet*)predmeti.at(1) ; 
      
     if (*p0 == *p1)  //poredjenje ce biti po operatorima iz klase UporedljiviPredmet
     {
         // itd ..... 
     } 
   }

} ; 
   


Isti princip vazi i za klasu Artikal i Skladiste .....

EDIT :
Ima i drugog nacina da se to uradi a mozda ce ti biti jasniji ceo koncept nasledjivanja ..
Npr .ako imas u klasi Predmet virtualnu funkciju poredjenja (operator ==)

Code:

class UporedljiviPredmet :public  Predmet 
{
public :
   int nBroj ; 
   UporedljiviPredmet () : Predmet() {} 
   virtual bool operator != (Predmet& rhs){}
    virtual  bool operator ==  (Predmet& rhs) 
    {
       UporedljiviPredmet& lhs = (UporedljiviPredmet&)rhs ;
       return nBroj == lhs.nBroj;
    } 

} ;

//sort metoda

UporedlljivaZbirka UPLista ;
Predmet * p0= new UporedljiviPredmet () ;
Predmet * p1= new UporedljiviPredmet () ;
UPLista.add(p0) ; 
UPLista.add(p1) ; 

Predmet* p0 =  UPLista.predmeti.at(0) ; 
Predmet* p1 =  UPLista .predmeti.at(1) ;  

if (*p0 == *p1) 
{
 .....
}



[Ovu poruku je menjao deerbeer dana 13.06.2008. u 19:55 GMT+1]

[Ovu poruku je menjao deerbeer dana 14.06.2008. u 12:16 GMT+1]