Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- class Color
- {
- public:
- virtual void accept(class Visitor*) = 0;
- };
- class Red: public Color
- {
- public:
- void accept(Visitor*);
- void clubA()
- {
- cout << "Red = club(A)\n";
- }
- };
- class Blu: public Color
- {
- public:
- void accept(Visitor*);
- void clubB()
- {
- cout << "Blu = club(B)\n";
- }
- };
- class Visitor
- {
- public:
- virtual void visit(Red*) = 0;
- virtual void visit(Blu*) = 0;
- };
- class CountVisitor: public Visitor
- {
- public:
- CountVisitor()
- {
- m_num_red = m_num_blu = 0;
- }
- /*virtual*/void visit(Red*)
- {
- ++m_num_red;
- }
- /*virtual*/void visit(Blu*)
- {
- ++m_num_blu;
- }
- void report_num()
- {
- cout << " " ;
- cout << "CLUB(A): " << m_num_red << " VS CLUB(B): " << m_num_blu << '\n';
- }
- private:
- int m_num_red, m_num_blu;
- };
- class CallVisitor: public Visitor
- {
- public:
- void visit(Red *r)
- {
- r->clubA();
- }
- void visit(Blu *b)
- {
- b->clubB();
- }
- };
- void Red::accept(Visitor *v)
- {
- v->visit(this);
- }
- void Blu::accept(Visitor *v)
- {
- v->visit(this);
- }
- int main()
- {
- Color *set[] =
- {
- new Red, new Blu, new Blu, new Red, new Red, new Blu, new Blu, new Red, new Blu, new Blu, new Blu, 0
- };
- CountVisitor count_operation;
- CallVisitor call_operation;
- for (int i = 0; set[i]; i++)
- {
- set[i]->accept(&count_operation);
- set[i]->accept(&call_operation);
- }
- count_operation.report_num();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement