Ну тут ньюансы. Требуемые для ИВЛ физические данные я хочу в виде классов сделать. На основе некоторых базовых классов (например, базовый класс с интерфейсом для получения данных из CAN, базовый класс с интерфейсом для получения из UART и т.д.). Такой подход даст возможность "зарегистрировать" обработчик принятого пакета CAN, относящийся к требуемым данным, в объекте "контроллер CAN", что даст возможность автоматического вызова нужного обработчика при приходе пакета CAN.
То есть имею:
1. класс "поток", в котором будет находится обработчик пакета CAN, и данные, представляющие сам поток.
2. объект класса "контроллер CAN", который ничего не знает о информации в шине и тупо вызывает зарегистрированные обработчики. Пусть сами классы разбираются с данными внутри пакета CAN
Поэтому сделать список это лишние сложности. В конструкторе режима ИВЛ (или в конструкторе промежуточного кэширующего класса) надо инициализировать указатели.
Что-то типа:
class CanRx { public: virtual void processID(const CAN_MSG &msg) = 0; }; class Flow : public CanRx { int32_t flow; public: const uint32_t ID; virtual void processID(const CAN_MSG &msg); /* виртуальная функция, наследуемая из базового класса CanRX. Именно она будет вызываться из контроллера CAN при приходе сообщения */ int32_t get() const; } class IVLmode { Flow *finsp; public: IVLmode(..., Flow *_finsp) : finsp(_finsp){} } где-то в коде: Flow fInsp; can.register(&fInsp, fInsp.ID); IVLmode cmv(..., &fInsp); для получения потока из членов класса IVLmode: finsp->get()Как-то так. При такой архитектуре списки неактуальны. Каждый модуль делает своё дело независимо от других модулей.