Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## Event.hpp
- class Event {
- public:
- Event();
- virtual ~Event();
- virtual std::auto_ptr<Event> copy() const = 0;
- virtual void accept(EventVisitor& visitor) const = 0;
- };
- template <typename T>
- class EventImpl : public Event {
- public:
- virtual std::auto_ptr<Event> copy() const {
- return std::auto_ptr<Event>(new T(*static_cast<const T*>(this)));
- }
- virtual void accept(EventVisitor& visitor) const {
- visitor.visit(*static_cast<const T*>(this));
- }
- };
- class MoveEvent : public EventImpl<MoveEvent> {
- public:
- MoveEvent(TokenSoul token, const Node& from_pos, const Node& to_pos);
- TokenSoul token() const { return token_; }
- const Node& from_pos() const { return from_pos_; }
- const Node& to_pos() const { return to_pos_; }
- private:
- TokenSoul token_;
- const Node& from_pos_;
- const Node& to_pos_;
- };
- class EventVisitor {
- public:
- virtual ~EventVisitor();
- // On peut overrider uniquement ça si on se fout du type précis de l'event
- virtual void visit(const Event& event);
- // On override ça si on sait gérer spécifiquement les MoveEvent
- virtual void visit(const MoveEvent& event);
- };
- ## Event.cpp
- void EventVisitor::visit(const Event& event) {
- // Un Throw serait plus adapté en mode nazi
- std::cerr << "*** Unknown event type `" << typeid(event).name()
- << "' for visitor `" << typeid(*this).name() << "'" << std::endl;
- }
- void EventVisitor::visit(const MoveEvent& event) {
- // L'implé par defaut de la gestion spécifique d'un MoveEvent
- // appelle la gestion générique d'events (juste au dessus)
- visit(*static_cast<const Event*>(&event));
- }
Add Comment
Please, Sign In to add comment