fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>
  4.  
  5. struct Wheel;
  6. struct Engine;
  7. struct Pipe;
  8.  
  9. template<class T>
  10. using Ptr = std::unique_ptr<T>;
  11.  
  12. struct Component
  13. {
  14. virtual ~Component() = default;
  15. };
  16.  
  17. struct Car
  18. {
  19. Car() { std::cout << "Yoba car ctor called\n"; }
  20. ~Car() { std::cout << "Car dtor called.\n"; }
  21.  
  22. std::vector<Ptr<Component>> m_carComponents;
  23.  
  24. template<typename T, typename... TArgs>
  25. void createComponent(TArgs&&... mArgs)
  26. {
  27. auto result(new T(std::forward<TArgs>(mArgs)...));
  28. m_carComponents.push_back(Ptr<Component>(result));
  29. }
  30. };
  31.  
  32. struct Wheel : public Component
  33. {
  34. Wheel(Car& car)
  35. : m_car(car)
  36. {
  37. std::cout << "Wheel attached to car.\n";
  38. }
  39.  
  40. ~Wheel() { std::cout << "Wheel dtor.\n"; }
  41.  
  42. Car& m_car;
  43. };
  44.  
  45. // аналогично остальные ебучие классы
  46.  
  47. int main()
  48. {
  49. Ptr<Car> car = std::make_unique<Car>();
  50. car->createComponent<Wheel>(*car);
  51.  
  52.  
  53. return 0;
  54. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
Yoba car ctor called
Wheel attached to car.
Car dtor called.
Wheel dtor.