#include
Using namespace std;
Class Element;
Class Elementa;
Class ElementB;
#define us_loki
#ifndef USE_LOKI
// Abstract Visitor
Class visitor {
PUBLIC:
Virtual Void VisiteLementa (Elementa &) = 0;
Virtual Void VisiteLementB (ElementB &) = 0;
}
// Concrete Visitors
Class Visitor1: Public visitor {
PUBLIC:
Virtual Void VisiteLementa (Elementa & Pa) {cout << "Visitor1 :: VisiteLementa << Endl;}
Virtual Void VisiteLementB (ElementB & Pb) {cout << "Visitor1 :: VisiteLementB << endl;}
}
Class Visitor2: Public Visitor {
PUBLIC:
Virtual Void VisiteLementa (Elementa & Pa) {cout << "Visitor2 :: VisiteLementa << Endl;}
Virtual Void VisiteLementB (ElementB & Pb) {COUT << "Visitor2 :: VisiteLementB << Endl;}
}
// Abstract Element
Class element {
PUBLIC:
Virtual Void Accept (Visitor &) = 0;
}
// Concrete Elements a and b
Class Elementa: Public element {
PUBLIC:
Virtual Void Accept (V.VisItem "(* this);
}
Class ElementB: Public element {
PUBLIC:
Virtual Void Accept (V.visiteLewB (* this);
}
#ELSE
#include "visitor.h"
Using namespace loki;
// Abstract Visitor
Typedef Cyclicvisitor
// Concrete Visitors
Class Visitor1: Public Myvisitor {
PUBLIC:
Virtual Void Visit (Element &) {}
Virtual Void Visit (Elementa & Pa) {cout << "Visitor1 :: VisiteLementa << Endl;}
Virtual Void Visit (ElementB & Pb) {cout << "Visitor1 :: VisiteLewB" << endl;}
}
Class Visitor2: public myvisitor {
PUBLIC:
Virtual Void Visit (Element &) {} Virtual Void Visit (Elementa & Pa) {COUT << "Visitor2 :: VisiteLementa << Endl;
Virtual Void ViID Visit (ElementB & Pb) {cout << "Visitor2 :: VisiteLementB << Endl;}
}
// Abstract Element
Class element {
PUBLIC:
Virtual Void Accept (Myvisitor &) = 0;
}
// Concrete Elements a and b
Class Elementa: Public element {
PUBLIC:
Define_cyclic_visitable (myvisitor);
}
Class ElementB: Public element {
PUBLIC:
Define_cyclic_visitable (myvisitor);
}
#ENDIF
int main ()
{
Visitor1 V1; // Algorithm 1
Visitor2 V2; // Algorithm 2
Elementa E1; // Object 1
ELEMENTB E2; // Object 2
E1.Accept (v1); // Object 1 algorithm 1
E1.Accept (v2); // Object 1 algorithm 2
E2.Accept (v1); // Object 2 algorithm 1
E2.Accept (v2); // Object 2 algorithm 2
}