встроенный — абстрактные аппаратные зависимости в переполнении стека

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

У меня есть интерфейс (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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]