fork(1) download
  1. #include <iostream>
  2. #include <unordered_map>
  3. #include <string>
  4.  
  5. namespace ComponentTypes
  6. {
  7. const std::string PlayerComponent = "PlayerComponent";
  8. const std::string GameObjectComponent = "GameObjectComponent";
  9. }
  10.  
  11. class Component
  12. {
  13. public:
  14. virtual Component* Clone() const = 0;
  15. virtual std::string ComponentType() const = 0;
  16. };
  17.  
  18. class Player : public Component
  19. {
  20. public:
  21. Component* Clone() const
  22. {
  23. return new Player(*this);
  24. }
  25.  
  26. std::string ComponentType() const
  27. {
  28. return ComponentTypes::PlayerComponent;
  29. }
  30. };
  31.  
  32. class GameObject : public Component
  33. {
  34. public:
  35. Component* Clone() const
  36. {
  37. return new GameObject(*this);
  38. }
  39.  
  40. std::string ComponentType() const
  41. {
  42. return ComponentTypes::GameObjectComponent;
  43. }
  44. };
  45.  
  46. class SomeContainer
  47. {
  48. private:
  49. std::unordered_map<std::string, Component*> m_components;
  50.  
  51. bool HasComponent(const std::string& componentType) const
  52. {
  53. return m_components.find(componentType) != m_components.end();
  54. }
  55.  
  56. public:
  57. void AddComponent(Component* theComponent)
  58. {
  59. if (!HasComponent(theComponent->ComponentType()))
  60. {
  61. m_components.insert(std::make_pair(theComponent->ComponentType(), theComponent));
  62. }
  63. else
  64. {
  65. std::cout << "I didn't add this " << theComponent->ComponentType();
  66. std::cout << " as I already have one" << std::endl;
  67. }
  68. }
  69.  
  70. Component* GetComponent(const std::string& componentType) const
  71. {
  72. return HasComponent(componentType) ? m_components.at(componentType)
  73. : nullptr;
  74. }
  75. };
  76.  
  77. int main()
  78. {
  79. auto someContainer = SomeContainer();
  80.  
  81. someContainer.AddComponent(new Player());
  82. someContainer.AddComponent(new GameObject());
  83.  
  84. auto retrievedPlayer = someContainer.GetComponent(ComponentTypes::PlayerComponent);
  85. std::cout << "Got component: " << retrievedPlayer->ComponentType() << std::endl;
  86.  
  87. auto retrievedGameObject = someContainer.GetComponent(ComponentTypes::GameObjectComponent);
  88. std::cout << "Got component: " << retrievedGameObject->ComponentType() << std::endl;
  89. return 0;
  90. }
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
Got component: PlayerComponent
Got component: GameObjectComponent