Абстрактные аппаратные зависимости в с ++

Я пытаюсь абстрагироваться от аппаратных зависимостей для встроенного приложения.

У меня есть интерфейс (frameWriterI.h)

template<typename Message)    
class FrameWriterI
{
     public:
        virtual void writeMessage(Message m)=0;
}

С несколькими реализациями, подобными этой

(writerA.h)
class WriterA : public FrameWriterI<MessageA>
{
   public:
     void writeMessage(MessageA m)
}
(writerA.cpp)
void WriterA::writeMessage(MessageA m)
{
     /*use a DAC to write m with a format specific to A*/
     somethingReallyHardwareSpecific();
}

В вышеприведенном слое у меня есть 1 конечный автомат для реализации (A, B, C), который использует связанные Writers

 class StateMachineA:
 {
    public:
        void doSomethingThatUseWriterA();
    private:
         WriterA writer;
}

Проблема в том, что теперь мои конечные автоматы зависят от оборудования. Поэтому, чтобы издеваться над писателем для модульного тестирования, я должен использовать вместо этого интерфейс:

 class StateMachineA:
 {
    public:
        void doSomethingThatUseWriterA();
    private:
         FrameWriterI<MessageA>& writer;
}

но где я могу инициализировать настоящий WriterA?

в конструкторе я не могу ссылаться на временный

(StateMachineA.cpp)
StateMachineA::StateMachineA(): writer(WriterA()){} //not valid

Я стараюсь избегать указателей как можно больше (ограниченное пространство кучи и предпочтения кодирования), но если это единственное решение, я мог бы жить с ним, но он не может быть динамически распределен.

Единственное решение, которое я нашел до сих пор, - это переменная области видимости файла

(StateMachineA.cpp)
WriterA realWriter;
StateMachineA::StateMachineA(): writer(realWriter){}

Есть ли лучшее / более чистое решение?

0 ответов

Другие вопросы по тегам