This week only. Pastebin PRO Accounts Christmas Special! Don't miss out!Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Dec 15th, 2011  |  syntax: C++  |  size: 4.62 KB  |  views: 45  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.         class Shape;
  2.  
  3.         typedef std::unique_ptr<Shape> shape_ptr;
  4.  
  5.         class Shape{
  6.  
  7.                 public:
  8.                         Shape(){};
  9.                         virtual ~Shape(){};
  10.  
  11.                         virtual void draw() const = 0;
  12.                         virtual float area() const = 0;
  13.  
  14.                         virtual shape_ptr clone() const = 0;
  15.                         virtual shape_ptr create() const = 0;
  16.         };
  17.  
  18.         class Rectangle:public Shape{
  19.                 public:
  20.  
  21.                         Rectangle(int height=0, int width=0):m_Height(height),m_Width(width){};
  22.                         ~Rectangle(){};
  23.  
  24.                         virtual void draw() const;
  25.                         virtual float area() const;
  26.  
  27.                         virtual shape_ptr clone() const{ return shape_ptr(new Rectangle(*this)); };
  28.                         virtual shape_ptr create() const{ return shape_ptr(new Rectangle()); };
  29.  
  30.                 private:
  31.                         int m_Height;
  32.                         int m_Width;
  33.         };
  34.  
  35.  
  36.         class Circle:public Shape{
  37.                 public:
  38.  
  39.                         Circle(float radius=0):m_Radius(radius){};
  40.                         ~Circle(){};
  41.  
  42.                         virtual void draw() const;
  43.                         virtual float area() const;
  44.  
  45.                         virtual shape_ptr clone() const{ return shape_ptr(new Circle(*this)); };
  46.                         virtual shape_ptr create() const{ return shape_ptr(new Circle()); };
  47.  
  48.                 private:
  49.                         float m_Radius;
  50.         };
  51.  
  52.         class ShapeContainer{
  53.  
  54.                 public:
  55.  
  56.                         typedef std::unique_ptr<Shape> ShapePtr;
  57.                         typedef std::vector<ShapePtr> ShapePtrContainer;
  58.  
  59.                         ShapeContainer(){};
  60.                         ShapeContainer( ShapeContainer && );
  61.                         ShapeContainer( const ShapeContainer & );
  62.                         ~ShapeContainer(){};
  63.  
  64.                         const ShapePtr & at(int ) const;
  65.  
  66.                         ShapeContainer & operator = (ShapeContainer&&);
  67.                         int size() const{ return static_cast<int>(m_vect.size()); };
  68.  
  69.                         friend ShapeContainer createBasicShapes();
  70.                         friend ShapeContainer createComplexShapes();
  71.  
  72.                         friend void swap(ShapeContainer& x, ShapeContainer& y) {x.m_vect.swap(y.m_vect);}
  73.  
  74.                 private:
  75.  
  76.                         ShapePtrContainer m_vect;
  77.         };
  78.  
  79.         class FooObj{
  80.  
  81.                 public:
  82.  
  83.                         FooObj(){};
  84.                         FooObj ( FooObj && );
  85.                         FooObj( const ShapeContainer & );
  86.                         FooObj ( const FooObj & );
  87.                         ~FooObj(){};
  88.  
  89.                         FooObj & operator = (FooObj && );
  90.  
  91.                         void drawShapes() const;
  92.  
  93.  
  94.                 private:
  95.                         ShapeContainer m_container;
  96.         };
  97.  
  98.         class FooRef{
  99.  
  100.                 public:
  101.  
  102.                         typedef std::unique_ptr<ShapeContainer> uptr;
  103.  
  104.                         FooRef(){};
  105.                         FooRef( const ShapeContainer & );
  106.                         FooRef( const FooRef & );
  107.                         ~FooRef(){};
  108.  
  109.                         FooRef & operator = (const FooRef & );
  110.  
  111.                         void drawShapes() const;
  112.  
  113.                 private:
  114.                         uptr m_container;
  115.  
  116.         };
  117.  
  118.         void Rectangle::draw() const{
  119.                 std::cout << "draw rectangle at address: " << this << std::endl;
  120.         }
  121.  
  122.         float Rectangle::area() const{
  123.                 float area = static_cast<float>(m_Height*m_Width);
  124.                 std::cout << "this is the Rectangle's area: " << area << std::endl;
  125.                 return area;
  126.         }
  127.  
  128.         void Circle::draw() const{
  129.                 std::cout << "draw circle at address: " << this << std::endl;
  130.         }
  131.  
  132.         float Circle::area() const{
  133.                 float area = static_cast<float>(m_Radius*2*3.1415);
  134.                 std::cout << "this is the Circle's area: " << area << std::endl;
  135.                 return area;
  136.         }
  137.  
  138.         ShapeContainer::ShapeContainer(ShapeContainer && other)
  139.                 :m_vect(std::move(other.m_vect))
  140.         {
  141.        
  142.         }
  143.  
  144.         ShapeContainer & ShapeContainer::operator = (ShapeContainer&& other){
  145.                 m_vect = std::move(other.m_vect);
  146.                 return (*this);
  147.         }
  148.  
  149.         ShapeContainer::ShapeContainer( const ShapeContainer & other ){
  150.                 for(int i=0; i<(int)other.m_vect.size(); i++){
  151.                         m_vect.push_back(other.m_vect[i]->clone());
  152.                 }
  153.         }
  154.  
  155.         ShapeContainer createBasicShapes(){
  156.                 ShapeContainer cont;
  157.                 cont.m_vect.push_back(ShapeContainer::ShapePtr(new Circle()));
  158.                 cont.m_vect.push_back(ShapeContainer::ShapePtr(new Rectangle()));
  159.                 return cont;
  160.         }
  161.  
  162.         ShapeContainer createComplexShapes(){
  163.                 ShapeContainer cont;
  164.                 cont.m_vect.push_back(ShapeContainer::ShapePtr(new Rectangle()));
  165.                 return cont;
  166.         }
  167.  
  168.         const ShapeContainer::ShapePtr & ShapeContainer::at( int index ) const{
  169.                 return m_vect[index];
  170.         }
  171.  
  172.         FooObj::FooObj( const ShapeContainer & cont )
  173.                 :m_container(cont)
  174.         {
  175.        
  176.         }
  177.  
  178.         FooObj::FooObj( const FooObj & other)
  179.                 :m_container(other.m_container)
  180.         {
  181.        
  182.         }
  183.  
  184.         FooObj & FooObj::operator = ( FooObj && other ){
  185.                 m_container = std::move(other.m_container);
  186.                 return (*this);
  187.         }
  188.  
  189.         void FooObj::drawShapes() const{
  190.        
  191.                 for(int i=0; i < m_container.size(); i++){
  192.                         m_container.at(i)->draw();
  193.                 }
  194.         }
  195.  
  196.         FooRef::FooRef( const ShapeContainer & shapec )
  197.                 :m_container( uptr(new ShapeContainer(shapec)))
  198.         {
  199.        
  200.         }
  201.  
  202.         void FooRef::drawShapes() const{
  203.        
  204.                 for(int i=0; i < m_container->size(); i++){
  205.                         m_container->at(i)->draw();
  206.                 }
  207.         }
  208.  
  209.         int main(int argc, char ** argv){
  210.  
  211.                 ShapeContainer mycontainer = createBasicShapes();
  212.                 cout << "hi" << endl;
  213.  
  214.                 FooObj myfoo(createBasicShapes());
  215.                 myfoo.drawShapes();
  216.  
  217.                 FooObj myfoo2 = myfoo;
  218.                 myfoo2.drawShapes();
  219.  
  220.                 return (EXIT_SUCCESS);
  221.  
  222.         }
clone this paste RAW Paste Data