1. Visitor.h
#ifndef VISITOR_H
#define VISITOR_H
class Visitor;
class Node
{
public:
virtual void Accept(Visitor &v) = 0;
};
class Exp : public Node
{};
class Unary : public Exp
{
friend class ShowVisitor;
private:
char op;
Exp *left;
public:
Unary();
Unary(char opt, Exp *l);
virtual void Accept(Visitor &v);
};
class Binary : public Unary
{
friend class ShowVisitor;
private:
Exp *right;
public:
Binary();
Binary(char opt, Exp *l, Exp *r);
virtual void Accept(Visitor &v);
};
class Number : public Exp
{
friend class ShowVisitor;
private:
int value;
public:
Number();
Number(int v);
virtual void Accept(Visitor &v);
};
/*************************************************/
class Visitor {
public:
virtual void VisitUnary(Unary *u) = 0;
virtual void VisitBinary(Binary *b) = 0;
virtual void VisitNumber(Number *n) = 0;
};
class ShowVisitor : public Visitor
{
public:
virtual void VisitUnary(Unary *u);
virtual void VisitBinary(Binary *b);
virtual void VisitNumber(Number *n);
};
#endif
#include "Visitor.h"
#include <iostream>
Unary::Unary(char op, Exp *l)
{
this->op = op;
this->left = l;
}
Binary::Binary(char op, Exp *l, Exp *r):Unary(op, l)
{
this->right = r;
}
Number::Number(int v)
{
this->value = v;
}
void Unary::Accept(Visitor &v)
{
v.VisitUnary(this);
}
void Binary::Accept(Visitor &v)
{
v.VisitBinary(this);
}
void Number::Accept(Visitor &v)
{
v.VisitNumber(this);
}
/*********************************************************/
void ShowVisitor::VisitUnary(Unary *u)
{
std::cout<<u->op<<std::endl;
u->left->Accept(*this);
}
void ShowVisitor::VisitBinary(Binary *b)
{
std::cout<<b->op<<std::endl;
b->left->Accept(*this);
b->right->Accept(*this);
}
void ShowVisitor::VisitNumber(Number *n)
{
std::cout<<n->value<<std::endl;
}
3.main.cpp
#include "Visitor.h"
int main ()
{
Visitor *v = new ShowVisitor();
Number *n = new Number(5);
Unary u('+', n);
Binary b('-', n, n);
n->Accept(*v);
u.Accept(*v);
b.Accept(*v);
delete v;
delete n;
return 0;
}