Я пытаюсь абстрагироваться от аппаратных зависимостей для встроенного приложения.
У меня есть интерфейс (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){}
Есть ли лучшее / более чистое решение?
Задача ещё не решена.
Других решений пока нет …