Listing 3

using namespace System;

public ref class Circle : ICloneable
{
     Point^ origin;
     float radius;
public:
     property Point^ Origin
     {
          Point^ get() { return static_cast<Point^>(origin->Clone()); }
     }
     void SetOrigin(int x, int y)
     { 
          origin->X = x;
          origin->Y = y;
     }
     void SetOrigin(Point^ p)
     { 
          SetOrigin(p->X, p->Y);
     }
     property double Radius
     {
          double get() { return radius; }
          void set(double value) {
               radius = static_cast<float>(value);
          }
     }
     Circle()
     {
          origin = gcnew Point;
          SetOrigin(0, 0);
          Radius = 0.0;
     }
     Circle(int x, int y, double r)
     {
          origin = gcnew Point;
          SetOrigin(x, y);
          Radius = r;
     }
     Circle(Point^ p, double r)
     {
          origin = gcnew Point;
          SetOrigin(p->X, p->Y);
          Radius = r;
     }
     virtual String^ ToString() override
     {
          return String::Concat("{", Origin, ",", Radius, "}");
     }

     virtual Object^ Clone()
     {
/*1*/          Circle^ c = static_cast<Circle^>(MemberwiseClone());
/*2*/          c->origin = static_cast<Point^>(origin->Clone());
/*3*/          return c;
     }
};