fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4. #include <unordered_map>
  5. using namespace std;
  6.  
  7. ////////////////////////////////////////////////////////////////
  8. // Manager declaration
  9. ////////////////////////////////////////////////////////////////
  10.  
  11. class manager {
  12. public:
  13. class instance;
  14.  
  15. instance &get_instance(string name);
  16. void print(string sender, string message);
  17.  
  18. private:
  19. unordered_map<string, unique_ptr<instance>> m_instances;
  20. };
  21.  
  22. ////////////////////////////////////////////////////////////////
  23. // Instance declaration
  24. ////////////////////////////////////////////////////////////////
  25.  
  26. class manager::instance {
  27. public:
  28. instance(string name, manager &manager);
  29. void print(string message);
  30.  
  31. private:
  32. string m_name;
  33. manager &m_manager;
  34. };
  35.  
  36. ////////////////////////////////////////////////////////////////
  37. // Manager implementation
  38. ////////////////////////////////////////////////////////////////
  39.  
  40. manager::instance &manager::get_instance(string name) {
  41. if (m_instances.find(name) == m_instances.end())
  42. m_instances[name] = unique_ptr<instance>(new instance(name, *this));
  43. return *m_instances[name].get();
  44. }
  45.  
  46. void manager::print(string sender, string message) {
  47. cout << sender << ": " << message << "." << endl;
  48. }
  49.  
  50. ////////////////////////////////////////////////////////////////
  51. // Instance implementation
  52. ////////////////////////////////////////////////////////////////
  53.  
  54. manager::instance::instance(string name, manager &manager) : m_name(name),
  55. m_manager(manager) {}
  56.  
  57. void manager::instance::print(string message) {
  58. m_manager.print(m_name, message);
  59. }
  60.  
  61. ////////////////////////////////////////////////////////////////
  62. // Main function
  63. ////////////////////////////////////////////////////////////////
  64.  
  65. int main() {
  66. manager m;
  67. m.get_instance("Window").print("Open up");
  68. m.get_instance("Asset").print("Load textures");
  69. return 0;
  70. }
  71.  
Success #stdin #stdout 0s 3480KB
stdin
Standard input is empty
stdout
Window: Open up.
Asset: Load textures.