Carcigenicate

Visitor

Jan 23rd, 2014
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct Base;
  8. struct A;
  9. struct B;
  10.  
  11. struct Visitor {
  12.     virtual void visit (Base& b) = 0;
  13.     virtual void visit (A& a) = 0;
  14.     virtual void visit (B& b) = 0;
  15.     };
  16.  
  17. struct Base {
  18.     int av;
  19.     virtual void accept (Visitor& v) { v.visit (*this); }
  20.    
  21.     Base () { av = 1;}
  22. };
  23.  
  24. struct A : public Base {
  25.     int bv;
  26.    
  27.     void accept (Visitor& v) { v.visit (*this); }
  28.    
  29.     A () { av = 2; bv = 3; }
  30. };
  31.  
  32. struct B : public Base {
  33.     string cv;
  34.    
  35.     void accept (Visitor& v) { v.visit (*this); }
  36.    
  37.     B () { av = 4; cv = "s5"; }
  38. };
  39.    
  40. struct Print : Visitor {
  41.     void visit (Base& b) { cout << "av " << b.av << endl; }
  42.     void visit (A& b) { cout << "bv " << b.bv << endl; }
  43.     void visit (B& b) { cout << "cv " << b.cv << endl; }
  44. } print;
  45.  
  46. struct data {
  47.     vector <Base*> basev;
  48.    
  49.     Base* findb (int value) {
  50.         static Base base; Base* pBase = &base;
  51.        
  52.         for (int i = 0; i < basev.size (); ++i) {
  53.             if (basev[i]->av == value) return basev[i];
  54.             }
  55.             return pBase;
  56.         }
  57. } d;
  58.  
  59.  
  60. int main() {
  61.  
  62. d.basev.push_back (new Base);
  63. d.basev.push_back (new A);
  64. d.basev.push_back (new B);
  65.  
  66. Base* found = d.findb (4);
  67.  
  68. found->accept (print);
  69.  
  70. cout << "\nDone";
  71. }
Advertisement
Add Comment
Please, Sign In to add comment