I am writing some example code that hopefully captures my current struggle.
Let's assume I have a class for some general shapes `Shape`
and a nice Function that doubles the perimeter of any shape

```
float DoublePerimeter (shared_ptr<Shape> shape)
  return 2*shape->GetPerimeter();
};

```

Is it possible to use such a function in a class itself?

```
class Square : Shape {
  float side = 1;
  public:
  void Square(float aside) : side(aside) {;}
  float GetPerimeter(){return 4*side;}
  void Computation() { DoublePerimeter (??????);}
};

```

What can I pass in the `??????` to make this work? I tried using something like

```
shared_ptr<Shape> share_this(this);

```

and also tried `enable_shared_from_this<>` for my class, however the pointer that I pass to the function always returns null on lock. Is this even possible, or is this bad design? Am I forced to make this function a member function?