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

provara tipova klase u run-time-u

[es] :: C/C++ programiranje :: provara tipova klase u run-time-u

[ Pregleda: 2095 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon provara tipova klase u run-time-u12.10.2010. u 20:06 - pre 149 meseci
Znam da ima slicna tema u vezi sa ovim, ali na njima nije razjasnjeno kako da izbegnem ovo u kodu.
Posto sam procitao da nesto nije u redu kod dizajna ako se ovo priimenjuje u nekom if() ili switch() sto se kod mene desava...

Code:

// Unit.h

class Unit
{
private:
    int myStrength;
    House myOwner;
    bool myRetreat;
public:
    enum unitType {Footmen, Knight};
    Unit();
    virtual ~Unit();
    virtual unitType getType() = 0;
    virtual void setStrength(int strength);
    virtual void setOwner(House owner);
    virtual int getStrength();
    virtual House getOwner();
    virtual void rest();
    virtual void retreat();
    virtual bool getRetreat();
};


//Footmen.h

class Knight : public Unit
{
public:
    Knight();
    virtual ~Knight();
    Unit::unitType getType();
};


//Knight.h

class Footmen : public Unit
{
public:
    Footmen();
    virtual ~Footmen();
    Unit::unitType getType();
};




E sada imam tu dva problema, prvi je sto tip ne bi trebao da se proverava ovako u if prilikom npr popunjavanja niza jedinica, a ja ne znam kako to da izbegnem.
Code:

addUnit(Unit *unit)
{
if(unit->getType() == Unit::Footmen) myUnits[x] = new Footmen();
}


A drugi je sto npr ako se desi da meni treba posle neka treca jedinica koja je izvedena iz klase Unit onda moram da dodajem u enum jos i npr Ship, tj moram da menjam baznu klasu, sto nije takodje dobar stil.

Kako ovo da resim?
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: provara tipova klase u run-time-u12.10.2010. u 20:32 - pre 149 meseci
Pa nema tu neke posebne magije. Treba samo da koristis Factory pattern.

http://sourcemaking.com/design_patterns/factory_method/cpp/1

tipove ne definisi u baznoj klasi vec izvan nje tako da je ne menjas svaki cas i primeni metod objasnjen na sajtu.
Tko leti vrijedi
 
Odgovor na temu

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon Re: provara tipova klase u run-time-u12.10.2010. u 20:49 - pre 149 meseci
Pa to mi ne daju neku prednost, ili ja ne uvidjam...
I u tom primeru ja opet moram da unapred znam kakve cu sve izvedene klase imati iz osnovne klase da bi napravio program...
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.mbb.telenor.rs.



+395 Profil

icon Re: provara tipova klase u run-time-u12.10.2010. u 21:06 - pre 149 meseci
Napravi jednu cisto vitualnu metodu create u unit klasi :
Code:

virtual Unit* create() = 0 ; 

u svakoj izvedenoj klasi bilo bi :

Code:
 
virtual Unit* Footmen ::create()  { 
return new Footman () ; 
}


onda metoda addUnit bi izgledala :
Code:
 
addUnit(Unit *unit){
   myUnits[x] = unit->create() ;
}


Viva lollapalooza
 
Odgovor na temu

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon Re: provara tipova klase u run-time-u12.10.2010. u 21:11 - pre 149 meseci
Hvala deerbeer! :)
Sad sam shvatio. :)
 
Odgovor na temu

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon Re: provara tipova klase u run-time-u12.10.2010. u 21:42 - pre 149 meseci
Samo me jos interesuje ako na primer imam metodu tipa:
Code:

int getNumberOfKnights()
{
}


Interesuje me kako da sada proveravam koliko instanci iz niza myUnits je tipa Knight?
Da ostavim ovo sa enumeracijom ili ima neko elegantnije i bolje resenje?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.mbb.telenor.rs.



+395 Profil

icon Re: provara tipova klase u run-time-u12.10.2010. u 21:47 - pre 149 meseci
http://en.wikipedia.org/wiki/Visitor_pattern

Viva lollapalooza
 
Odgovor na temu

NaN
Vanja Grujic

Član broj: 259663
Poruke: 4
*.dynamic.sbb.rs.



+1 Profil

icon Re: provara tipova klase u run-time-u13.10.2010. u 00:00 - pre 149 meseci
Vajda, Gruja je. Ako sam ja dobro shvatio, treba ovako da ide:

Unit.h
Code:
class Unit
{
...
virtual void accept(Visitor*) = 0; //novo
};



Knight.h
Code:

class Knight : public Unit
{
...
virtual void accept(Visitor*); //novo
};


Knight.cpp
Code:

...
void Knight::accept (Visitor* v) {v->visit(this);} //novo


Isto to dodas i za Footmana i za Ship, da ne pisem sve to sad.


I onda:

Visitor.h
Code:

class Visitor 
{
public:
    virtual ~Visitor(){}
    virtual void visit(Footmen*) = 0;
    virtual void visit(Knight*) = 0;
    virtual void visit(Ship*) = 0;
}


CounterVisitor.h
Code:

class CounterVisitor : public Visitor 
{
public:
    virtual void visit(Footmen*);
    virtual void visit(Knight*);
    virtual void visit(Ship*);
    CounterVisitor();
private:
int f_count, s_count, k_count;
}


I konacno CounterVisitor.cpp
Code:

void CounterVisitor::visit(Footmen* f) {f_count++;}
void CounterVisitor::visit(Knight* k) {k_count++;}
void CounterVisitor::visit(Ship* s) {s_count++;}

CounterVisitor::CounterVisitor() { f_count = k_count = s_count = 0; }


Tako da u buducnosti u svakoj klasi samo moras da stavis accept i dalje menjas samo ove visitore (npr kada dodas novu klasu, katapult ili statijaznam).
 
Odgovor na temu

Wajda.W
Vladimir Vajda
Zrenjanin

Član broj: 127039
Poruke: 323
*.dynamic.isp.telekom.rs.



+101 Profil

icon Re: provara tipova klase u run-time-u13.10.2010. u 09:40 - pre 149 meseci
Ok, hvala Grujo. :)
 
Odgovor na temu

[es] :: C/C++ programiranje :: provara tipova klase u run-time-u

[ Pregleda: 2095 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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