Oppure

Loading
26/01/19 17:14
naruto98
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
.

class Weapon {
public:
virtual ~Weapon() = 0;
};

class AssaultRifle : public Weapon {
};

class SniperRfile : public Weapon {
};

class PhysicalFeature {
public:
virtual ~PhysicalFeature() = 0;
};

class Stamina : public PhysicalFeature {
};

class HoldBreath : public PhysicalFeature {
};

class Character {
public:
virtual ~Character() = 0;
void setPhysical(PhysicalFeature * aPF) {
pf = aPF;
}
void setWeapon(Weapon* aW) {
 w = aW;
}

protected:
PhysicalFeature * pf;
Weapon* w;
};

class AssaultTrooper : public Character {
public:
AssaultTrooper (int s) : strength (s) {};
void doRun() {};

private:
int strength;
};

class Sniper : public Character {
public:
Sniper (int p) : precision(p) {};
void doSnipe() {};

private:
int precision;
};

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 26/01/19 17:18
aaa
26/01/19 17:39
TheDarkJuster
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.
aaa
27/01/19 10:30
naruto98
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:
void setPhysical(PhysicalFeature * aPF) {
if(dynamic_cast<Stamina*>(aPF)!=nullptr)
pf = aPF;
}
Ultima modifica effettuata da naruto98 27/01/19 10:33
aaa
27/01/19 12:36
TheDarkJuster
Postato originariamente da naruto98:
Postato originariamente da TheDarkJuster:
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato &amp;amp;Atilde;&amp;amp;uml; un nullptr o altro. Se &amp;amp;Atilde;&amp;amp;uml; nullptr l'oggetto passato non &amp;amp;Atilde;&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:
void setPhysical(PhysicalFeature * aPF) {
if(dynamic_cast<Stamina*>(aPF)!=nullptr)
pf = aPF;
}


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.
aaa
28/01/19 16:25
naruto98
Postato originariamente da TheDarkJuster:
Postato originariamente da naruto98:
Postato originariamente da TheDarkJuster:
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato &amp;amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;amp;uml; un nullptr o altro. Se &amp;amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;amp;uml; nullptr l'oggetto passato non &amp;amp;amp;amp;amp;Atilde;&amp;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:
void setPhysical(PhysicalFeature * aPF) {
if(dynamic_cast<Stamina*>(aPF)!=nullptr)
pf = aPF;
}


Esattamente. Inoltre considera che dovresti chiamare setPhysical dal costruttore e magari dichiarare il campo come costante, visto che &amp;Atilde;&amp;uml; una propriet&amp;Atilde;&amp;nbsp; invariabile nel tempo di vita di un oggetto, inoltre comsidera di dichiarare pf come costante. Comunque questa &amp;Atilde;&amp;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.

class CharacterFactory {
public:
    virtual ~CharacterFactory() {}
    virtual Character* createCharacter() = 0;
};

class AssaultTrooperFactory : public CharacterFactory{
    virtual ~AssaultTrooperFactory() {}
    virtual Character* createCharacter() override{
        return new AssaultTrooper(10);
    }
};

class SniperFactory : public CharacterFactory{
    virtual ~SniperFactory() {}
    virtual Character* createCharacter() override{
        return new Sniper(10);
    }
};
Ultima modifica effettuata da naruto98 28/01/19 16:27
aaa
28/01/19 17:07
TheDarkJuster
Postato originariamente da naruto98:

Postato originariamente da TheDarkJuster:
Postato originariamente da naruto98:
Postato originariamente da TheDarkJuster:
Devi usare un dynamic_cast<Stamina*>(...) Per controllare se il risultato &amp;amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;amp;uml; un nullptr o altro. Se &amp;amp;amp;amp;amp;Atilde;&amp;amp;amp;amp;amp;uml; nullptr l'oggetto passato non &amp;amp;amp;amp;amp;Atilde;&amp;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:
void setPhysical(PhysicalFeature * aPF) {
if(dynamic_cast<Stamina*>(aPF)!=nullptr)
pf = aPF;
}



Esattamente. Inoltre considera che dovresti chiamare setPhysical dal costruttore e magari dichiarare il campo come costante, visto che &amp;Atilde;&amp;uml; una propriet&amp;Atilde;&amp;nbsp; invariabile nel tempo di vita di un oggetto, inoltre comsidera di dichiarare pf come costante. Comunque questa &amp;Atilde;&amp;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.

class CharacterFactory {
public:
    virtual ~CharacterFactory() {}
    virtual Character* createCharacter() = 0;
};

class AssaultTrooperFactory : public CharacterFactory{
    virtual ~AssaultTrooperFactory() {}
    virtual Character* createCharacter() override{
        return new AssaultTrooper(10);
    }
};

class SniperFactory : public CharacterFactory{
    virtual ~SniperFactory() {}
    virtual Character* createCharacter() override{
        return new Sniper(10);
    }
};


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;
aaa