#include <iostream>
#include <vector>
#include <set>
#include <string>

using std::string;
using std::cout;
using std::cin;
using std::vector;
using std::endl;

string class_id;

class Object {
 public:
  virtual std::string ToString() const = 0;
  virtual ~Object() {}
};

class Smth : public Object {
 public:
  Smth(const std::string &class_id) {
    class_id_ = class_id;
  }

  std::string ToString() const override {
    return class_id_;
  }
 private:
  std::string class_id_;
};

Object *my_new_smth_() {
  return new Smth(class_id);
}

class Factory {
 public:

  Object *Create(const std::string &class_id) {
    return my_new_smth_();
  }

  void Register(const std::string &class_id, Object *(*instance_creator)()) {
    instance_creator()->ToString() = class_id;
  }
};