#include <iostream>
#include <vector>
#include <memory>

struct Wheel;
struct Engine;
struct Pipe;

template<class T>
using Ptr = std::unique_ptr<T>;

struct Component
{
    virtual ~Component() = default;
};

struct Car
{
    Car() { std::cout << "Yoba car ctor called\n"; }
    ~Car() { std::cout << "Car dtor called.\n"; }

    std::vector<Ptr<Component>> m_carComponents;

    template<typename T, typename... TArgs> 
    void createComponent(TArgs&&... mArgs)
    {
        auto result(new T(std::forward<TArgs>(mArgs)...));
        m_carComponents.push_back(Ptr<Component>(result));
    }
};

struct Wheel : public Component
{
    Wheel(Car& car)
        : m_car(car)
    {
        std::cout << "Wheel attached to car.\n";
    }

    ~Wheel() { std::cout << "Wheel dtor.\n"; }

    Car&    m_car;
};

// аналогично остальные ебучие классы 

int main()
{
    Ptr<Car> car = std::make_unique<Car>();
    car->createComponent<Wheel>(*car);


    return 0;
}