fork download
  1. #include <iostream>
  2. #include <functional>
  3. #include <unordered_map>
  4. #include <vector>
  5. #include <memory>
  6.  
  7. // Gemeinsame Basisklasse
  8. class Base {
  9. public:
  10. // Virtueller Destruktor
  11. virtual ~Base () {}
  12. virtual void test () = 0;
  13. };
  14. // Abgeleitete Klassen
  15. class Derived1 : public Base {
  16. public:
  17. virtual ~Derived1 () { std::cout << "Derived1::~Derived1\n"; }
  18. virtual void test () { std::cout << "Derived1::test\n"; }
  19. };
  20. class Derived2 : public Base {
  21. public:
  22. virtual ~Derived2 () { std::cout << "Derived2::~Derived2\n"; }
  23. virtual void test () { std::cout << "Derived2::test\n"; }
  24. };
  25.  
  26. // Zuordnung (map) ID->Factory-Funktion
  27. std::unordered_map<int, std::function<std::unique_ptr<Base> ()>> factories {
  28. { 1 , []() { return std::unique_ptr<Base> (new Derived1); }},
  29. { 42, []() { return std::unique_ptr<Base> (new Derived2); }}};
  30.  
  31. std::vector<std::unique_ptr<Base>> getObjects (std::vector<int> input) {
  32. // Erzeugte Objekte
  33. std::vector<std::unique_ptr<Base>> objects;
  34.  
  35. for (int i : input) {
  36. // Suche Factory-Funktion...
  37. auto f = factories.find (i);
  38. if (f != factories.end ())
  39. // Rufe Factory-Funktion auf, erstelle Objekt, speichere in "objects"
  40. objects.push_back ((f->second) ());
  41. else
  42. std::cout << "Unbekannte ID " << i << std::endl;
  43. }
  44. return objects;
  45. }
  46.  
  47.  
  48. int main () {
  49. // Angenommen, das hier ist zur kompilezeit nicht bekannt (Dateieingabe o.ä.); enthält Liste an ID's, von denen Objekte angelegt werden sollen
  50. std::vector<int> input { 42, 1, 1, 42, 3, 1 };
  51. auto objects = getObjects (std::move (input));
  52.  
  53. // Rufe virtuelle Funktion auf Objekten auf
  54. for (auto& obj : objects)
  55. obj->test ();
  56.  
  57. // unique_ptr löscht Objekte hier
  58. }
  59.  
  60.  
Success #stdin #stdout 0s 3480KB
stdin
Standard input is empty
stdout
Unbekannte ID 3
Derived2::test
Derived1::test
Derived1::test
Derived2::test
Derived1::test
Derived2::~Derived2
Derived1::~Derived1
Derived1::~Derived1
Derived2::~Derived2
Derived1::~Derived1