Bonjour à tous !
Voilà je découvre le c++, et je cherche à modéliser quelque chose de simple du point de vue de la conception objet, mais c'est déjà assez subtil quand on débute (et qu'on a des "habitudes" liées au langage java)
En gros ce que je veux faire :
Code :
- int main(void) {
- MachineAEtat machine;
- Action changementdEtat;
- machine.run(changementdEtat);
- return 0;
- }
- class MachineAEtat {
- public:
- Etat* etatCourant;
- MachineAEtat() {
- etatCourant = new Depart();
- }
- void run(const Action& action) {
- *etatCourant = etatCourant->agir(action);
- }
- };
- class Etat {
- public:
- virtual void agir(const Action& ) = 0;
- };
- class Depart : public Etat {
- public:
- Etat& agir(const Action& action) {
- if (action.getMessage() == "changer" ) {
- return *(new Arrivee());
- }
- return *this;
- }
- };
- class Arrivee : public Etat {
- public:
- Etat& agir(const Action& action) {
- if (action.getMessage() == "changer" ) {
- return *(new Depart());
- }
- return *this;
- }
- };
|
Ce à quoi j'aspire :
- si je suis dans Depart, que je crée un Arrivee, je veux transmettre des informations, donc je passe par un constructeur par copie.
Etat peut faire : Etat(const Etat& )
Arrivee peut faire : Arrivee(const Etat& )
Et donc moi je renvoie un *(new Arrivee(*this)) depuis la classe Départ
En gros vous en pensez quoi niveau "intégrité des objets ?" Je me demande si je ne suis pas en train de caster comme un grouik dans tous les sens
Autre question ! J'ai trouvé ceci sur un post de fin2004 du forum, au sujet du cast du C qui est à proscrire :
Code :
- class Truc {
- public:
- virtual void prout() {
- std::cout<<"prout\n";
- }
- };
- class Machin {
- public:
- virtual void roger() {
- std::cout<<"roger\n";
- }
- };
-
- class Bidule : public Truc, Machin {
-
- };
-
- int main() {
- Bidule * bidule = new Bidule(); // on fait un bidule
- Truc * tr = (Truc*) (bidule); // bidule etant aussi un Truc,
- //on peut le caster, n'est ce pas ?
- tr->prout();
- Machin * mc = (Machin* ) (tr); // d'accord, Truc n'est pas un Machin, mais finalement,
- // le type reel de notre "Truc"
- // c'est "Bidule" et "Bidule" est aussi un machin. Logique, non ?
-
- mc->roger(); //de facon tres interessante,
- //on ne verra pas "roger" a l'ecran, mais "prout".
- //avec RTTI et dynamic cast, ca affiche bien "roger"
- return 0;
- }
|
Sauf que pour moi:
avec le cast du C : ca affiche en effet ce que disent les commentaires, donc pas le résultat attendu
avec le dynamic cast : ben moi ca crash
Voilà, si quelqu'un veut bien éclairer ma lanterne
---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.