Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Aiuto esercizio c++
Forum - C/C++ - Aiuto esercizio c++

Avatar
naruto98 (Normal User)
Newbie


Messaggi: 4
Iscritto: 26/01/2019

Segnala al moderatore
Postato alle 18:14
Sabato, 26/01/2019
Salve a tutti, ho un problema con la seguente richiesta in un esercizio:
Si considerino le seguenti classi relative ai personaggi di un videogioco. Si scrivano le classi
necessarie (Abstract Factory) a fare in modo che ad uno AssaultTrooper possa essere associato solo
un AssaultRifle ed una Stamina, mentre ad uno Sniper siano associate solo SniperRifle e HoldBreath
.

Codice sorgente - presumibilmente C++

  1. class Weapon {
  2. public:
  3. virtual ~Weapon() = 0;
  4. };
  5.  
  6. class AssaultRifle : public Weapon {
  7. };
  8.  
  9. class SniperRfile : public Weapon {
  10. };
  11.  
  12. class PhysicalFeature {
  13. public:
  14. virtual ~PhysicalFeature() = 0;
  15. };
  16.  
  17. class Stamina : public PhysicalFeature {
  18. };
  19.  
  20. class HoldBreath : public PhysicalFeature {
  21. };
  22.  
  23. class Character {
  24. public:
  25. virtual ~Character() = 0;
  26. void setPhysical(PhysicalFeature * aPF) {
  27. pf = aPF;
  28. }
  29. void setWeapon(Weapon* aW) {
  30.  w = aW;
  31. }
  32.  
  33. protected:
  34. PhysicalFeature * pf;
  35. Weapon* w;
  36. };
  37.  
  38. class AssaultTrooper : public Character {
  39. public:
  40. AssaultTrooper (int s) : strength (s) {};
  41. void doRun() {};
  42.  
  43. private:
  44. int strength;
  45. };
  46.  
  47. class Sniper : public Character {
  48. public:
  49. Sniper (int p) : precision(p) {};
  50. void doSnipe() {};
  51.  
  52. private:
  53. int precision;
  54. };



Il mio problema si trova nella parte in grassetto del comando dell'esercizio, non riesco proprio a capire come fare. So che è un problema piuttosto banale, chiedo venia 8-|
Grazie a chiunque sia disposto ad aiutarmi

Ultima modifica effettuata da naruto98 il 26/01/2019 alle 18:18
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1606
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:39
Sabato, 26/01/2019
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato è un nullptr o altro. Se è nullptr l'oggetto passato non è di tipo Stamina e nemmeno un suo sottotipo.

PM Quote
Avatar
naruto98 (Normal User)
Newbie


Messaggi: 4
Iscritto: 26/01/2019

Segnala al moderatore
Postato alle 11:30
Domenica, 27/01/2019
Testo quotato

Postato originariamente da TheDarkJuster:
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato &Atilde;&uml; un nullptr o altro. Se &Atilde;&uml; nullptr l'oggetto passato non &Atilde;&uml; di tipo Stamina e nemmeno un suo sottotipo.


Allora grazie molte per la risposta! Quindi mi stai dicendo di usare un dynamic_cast all'interno del metodo setPhysical nelle classi AssaultTrooper e SniperRifle?
Del tipo:
Codice sorgente - presumibilmente C/C++

  1. void setPhysical(PhysicalFeature * aPF) {
  2. if(dynamic_cast<Stamina*>(aPF)!=nullptr)
  3. pf = aPF;
  4. }


Ultima modifica effettuata da naruto98 il 27/01/2019 alle 11:33
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1606
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 13:36
Domenica, 27/01/2019
Testo quotato

Postato originariamente da naruto98:
Testo quotato

Postato originariamente da TheDarkJuster:
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato &amp;Atilde;&amp;uml; un nullptr o altro. Se &amp;Atilde;&amp;uml; nullptr l'oggetto passato non &amp;Atilde;&amp;uml; di tipo Stamina e nemmeno un suo sottotipo.


Allora grazie molte per la risposta! Quindi mi stai dicendo di usare un dynamic_cast all'interno del metodo setPhysical nelle classi AssaultTrooper e SniperRifle?
Del tipo:
Codice sorgente - presumibilmente C/C++

  1. void setPhysical(PhysicalFeature * aPF) {
  2. if(dynamic_cast<Stamina*>(aPF)!=nullptr)
  3. pf = aPF;
  4. }





Esattamente. Inoltre considera che dovresti chiamare setPhysical dal costruttore e magari dichiarare il campo come costante, visto che è una proprietà invariabile nel tempo di vita di un oggetto, inoltre comsidera di dichiarare pf come costante. Comunque questa è solo una questione di stile, desogn del codice e const-correctness, la soluzione al tuo problema l'hai gia trovata.

PM Quote
Avatar
naruto98 (Normal User)
Newbie


Messaggi: 4
Iscritto: 26/01/2019

Segnala al moderatore
Postato alle 17:25
Lunedì, 28/01/2019
Testo quotato

Postato originariamente da TheDarkJuster:
Testo quotato

Postato originariamente da naruto98:
Testo quotato

Postato originariamente da TheDarkJuster:
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato &amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;uml; un nullptr o altro. Se &amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;uml; nullptr l'oggetto passato non &amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;uml; di tipo Stamina e nemmeno un suo sottotipo.


Allora grazie molte per la risposta! Quindi mi stai dicendo di usare un dynamic_cast all'interno del metodo setPhysical nelle classi AssaultTrooper e SniperRifle?
Del tipo:
Codice sorgente - presumibilmente C/C++

  1. void setPhysical(PhysicalFeature * aPF) {
  2. if(dynamic_cast<Stamina*>(aPF)!=nullptr)
  3. pf = aPF;
  4. }





Esattamente. Inoltre considera che dovresti chiamare setPhysical dal costruttore e magari dichiarare il campo come costante, visto che &Atilde;&uml; una propriet&Atilde;&nbsp; invariabile nel tempo di vita di un oggetto, inoltre comsidera di dichiarare pf come costante. Comunque questa &Atilde;&uml; solo una questione di stile, desogn del codice e const-correctness, la soluzione al tuo problema l'hai gia trovata.



Grazie mille davvero, sei stato molto gentile ed esplicativo. Ne approfitto della tua gentilezza e pazienza chiedendoti delucidazioni, o meglio rassicurazioni, sulla prima parte dell'esercizio. Sbaglio qualcosa ad impostare in questo modo le classi necessarie per implementare un Abstract Factory? Non riesco molto bene a distinguere l'Abstract Factory con il Factory Method.

Codice sorgente - presumibilmente C++

  1. class CharacterFactory {
  2. public:
  3.     virtual ~CharacterFactory() {}
  4.     virtual Character* createCharacter() = 0;
  5. };
  6.  
  7. class AssaultTrooperFactory : public CharacterFactory{
  8.     virtual ~AssaultTrooperFactory() {}
  9.     virtual Character* createCharacter() override{
  10.         return new AssaultTrooper(10);
  11.     }
  12. };
  13.  
  14. class SniperFactory : public CharacterFactory{
  15.     virtual ~SniperFactory() {}
  16.     virtual Character* createCharacter() override{
  17.         return new Sniper(10);
  18.     }
  19. };


Ultima modifica effettuata da naruto98 il 28/01/2019 alle 17:27
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1606
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:07
Lunedì, 28/01/2019
Testo quotato

Postato originariamente da naruto98:

Testo quotato

Postato originariamente da TheDarkJuster:
Testo quotato

Postato originariamente da naruto98:
Testo quotato

Postato originariamente da TheDarkJuster:
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato &amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;uml; un nullptr o altro. Se &amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;uml; nullptr l'oggetto passato non &amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;uml; di tipo Stamina e nemmeno un suo sottotipo.


Allora grazie molte per la risposta! Quindi mi stai dicendo di usare un dynamic_cast all'interno del metodo setPhysical nelle classi AssaultTrooper e SniperRifle?
Del tipo:
Codice sorgente - presumibilmente C/C++

  1. void setPhysical(PhysicalFeature * aPF) {
  2. if(dynamic_cast<Stamina*>(aPF)!=nullptr)
  3. pf = aPF;
  4. }





Esattamente. Inoltre considera che dovresti chiamare setPhysical dal costruttore e magari dichiarare il campo come costante, visto che &Atilde;&uml; una propriet&Atilde;&nbsp; invariabile nel tempo di vita di un oggetto, inoltre comsidera di dichiarare pf come costante. Comunque questa &Atilde;&uml; solo una questione di stile, desogn del codice e const-correctness, la soluzione al tuo problema l'hai gia trovata.



Grazie mille davvero, sei stato molto gentile ed esplicativo. Ne approfitto della tua gentilezza e pazienza chiedendoti delucidazioni, o meglio rassicurazioni, sulla prima parte dell'esercizio. Sbaglio qualcosa ad impostare in questo modo le classi necessarie per implementare un Abstract Factory? Non riesco molto bene a distinguere l'Abstract Factory con il Factory Method.

Codice sorgente - presumibilmente C++

  1. class CharacterFactory {
  2. public:
  3.     virtual ~CharacterFactory() {}
  4.     virtual Character* createCharacter() = 0;
  5. };
  6.  
  7. class AssaultTrooperFactory : public CharacterFactory{
  8.     virtual ~AssaultTrooperFactory() {}
  9.     virtual Character* createCharacter() override{
  10.         return new AssaultTrooper(10);
  11.     }
  12. };
  13.  
  14. class SniperFactory : public CharacterFactory{
  15.     virtual ~SniperFactory() {}
  16.     virtual Character* createCharacter() override{
  17.         return new Sniper(10);
  18.     }
  19. };




Non saprei cosa dirti, non ho mai avuto a che fare con un fabbricatore di oggetti. Ti posso dire che il tuo codice è corretto dal punto di vista logico. Non so assolutamente dirti se il mio punto di vista logico sia quello del tuo professore.
Sotto il profilo sintattico avrei da dire: 1) se usi override non ti serve specificare virtual. 2) se il costruttore ti serve in versione di default esplicitalo come si deve: virtual ~AssaultTrooperFactory() = default;

PM Quote