Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 3.192 pregleda

Najnovija ↓

[Zadatak] klasa Predmet 13.06.2008. u 14:06 · pre 223 meseca #1
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
Re: [Zadatak] klasa Predmet 13.06.2008. u 15:20 · pre 223 meseca #2
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?
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Re: [Zadatak] klasa Predmet 13.06.2008. u 16:37 · pre 223 meseca #3
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) ; 


Potpis
Viva lollapalooza
Re: [Zadatak] klasa Predmet 13.06.2008. u 17:16 · pre 223 meseca #4
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.
Re: [Zadatak] klasa Predmet 13.06.2008. u 18:42 · pre 223 meseca
izmenjeno 2 puta, poslednji put deerbeer 14.06.2008. u 12:16
  1. deerbeer14.06.2008. u 12:16zapis iz teksta poruke
  2. deerbeer13.06.2008. u 19:55zapis iz teksta poruke
#5
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) 
{
 .....
}

Potpis
Viva lollapalooza
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme