fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class ShapeVisitor;
  6.  
  7. struct Shape {
  8. virtual void accept(ShapeVisitor& v) = 0;
  9. virtual bool overlaps(Shape& other) = 0;
  10. };
  11.  
  12. class Circle;
  13. class Square;
  14.  
  15. struct ShapeVisitor {
  16. virtual void visitCircle(Circle& c) = 0;
  17. virtual void visitSquare(Square& s) = 0;
  18. };
  19.  
  20. bool checkOverlap(Square& s, Circle& c) {
  21. cout << "Checking if square overlaps circle" << endl;
  22. return false;
  23. }
  24. bool checkOverlap(Square& a, Square& b) {
  25. cout << "Checking if square overlaps square" << endl;
  26. return false;
  27. }
  28. bool checkOverlap(Circle& a, Circle& b) {
  29. cout << "Checking if circle overlaps circle" << endl;
  30. return false;
  31. }
  32.  
  33. class Square : public Shape {
  34. struct OverlapVisitor : public ShapeVisitor {
  35. OverlapVisitor(Square& _my) : result(false), my(_my) {}
  36. virtual void visitCircle(Circle& c) {
  37. result = checkOverlap(my, c);
  38. }
  39. virtual void visitSquare(Square& s) {
  40. result = checkOverlap(my, s);
  41. }
  42. bool result;
  43. Square& my;
  44. };
  45. public:
  46. virtual void accept(ShapeVisitor& v) {
  47. v.visitSquare(*this);
  48. }
  49. virtual bool overlaps(Shape& other) {
  50. OverlapVisitor v(*this);
  51. other.accept(v);
  52. return v.result;
  53. }
  54. };
  55.  
  56. class Circle : public Shape {
  57. struct OverlapVisitor : public ShapeVisitor {
  58. OverlapVisitor(Circle& _my) : result(false), my(_my) {}
  59. virtual void visitCircle(Circle& c) {
  60. result = checkOverlap(my, c);
  61. }
  62. virtual void visitSquare(Square& s) {
  63. result = checkOverlap(s, my);
  64. }
  65. bool result;
  66. Circle& my;
  67. };
  68. public:
  69. virtual void accept(ShapeVisitor& v) {
  70. v.visitCircle(*this);
  71. }
  72. virtual bool overlaps(Shape& other) {
  73. OverlapVisitor v(*this);
  74. other.accept(v);
  75. return v.result;
  76. }
  77. };
  78.  
  79. int main() {
  80. Square s;
  81. Circle c;
  82. s.overlaps(c);
  83. s.overlaps(s);
  84. c.overlaps(s);
  85. c.overlaps(c);
  86. return 0;
  87. }
Success #stdin #stdout 0s 2856KB
stdin
Standard input is empty
stdout
Checking if square overlaps circle
Checking if square overlaps square
Checking if square overlaps circle
Checking if circle overlaps circle