#include <string>
#include <iostream>
class Foo {
  friend class CopyManipulation;
public:
  class CopyManipulation {
  public:
    CopyManipulation::CopyManipulation(Foo *src) : src(src) {}
    void CopyManipulation::to(Foo *dst) {dst->value = src->value;}
  private:
    Foo *src;
  };
  Foo::Foo(int value) : value(value) {}
  static CopyManipulation Foo::copy(Foo *src) {return CopyManipulation(src);}
  void Foo::print(std::ostream &out) {out << this << ':' << value << std::endl;}
private:
  int value;
};
int main() {
  Foo *src = new Foo(89), *dst = new Foo(97);
  src->print(std::cout);
  dst->print(std::cout);
  Foo::copy(src).to(dst);
  src->print(std::cout);
  dst->print(std::cout);
  return 0;
}