Я пытаюсь создать класс, в котором мы можем кодировать и декодировать различные структуры от и до символа *.
Я делаю это следующим образом, я сделал реферат
универсальный класс под названием CANgenericMsg, где CANgenericMsg.cpp:
#include "CANgenericMsg.h"
CANgenericMsg::CANgenericMsg() {
// TODO Auto-generated constructor stub
}
void CANgenericMsg::decode(char* chars) {
CANgenericMsg::str* data = reinterpret_cast<CANgenericMsg::str*>(chars);
structure = *data;
}
char* CANgenericMsg::encode() {
return reinterpret_cast<char*>(&structure);
}CANgenericMsg::~CANgenericMsg() {
// TODO Auto-generated destructor stub
}
И с заголовком:
class CANgenericMsg {
public:
CANgenericMsg();
void decode(char* chars);
virtual ~CANgenericMsg();
char* encode();
virtual struct str structure;
};
Этот класс расширяется реальными классами, такими как CANintegermsg, в котором конструктор этого класса вводит структуру:
class CANintegermsg: public CANgenericMsg {
public:
CANintegermsg(int i);
virtual ~CANintegermsg();
struct str {
unsigned short int my_int;
} structure;
};
Идея в том, что вы можете установить определенный тип структуры в каждом расширенном классе. Проблема в том, что C ++ не распознает виртуальные структуры. Я мог бы переместить функции кодирования и декодирования в каждый расширенный класс, но так как их много, это привело бы к дублированию кода. Существует ли удобный способ использовать функции кодирования и декодирования, подобные этой?
Вы можете использовать шаблоны:
template<class T>
class CANGenericMsg
{
public:
CANGenericMsg(const T val) : m_structureObj(val) {}
void decode(char* chars)
{
T* data = reinterpret_cast<T*>(chars);
m_structureObj = *data;
}
char* encode()
{
return reinterpret_cast<char*>(&m_structureObj);
}
private:
T m_structureObj;
};
struct StructUShortInt { unsigned short int my_int; };
using CANIntegerMsg = CANGenericMsg<StructUShortInt>;
Это звучит (пожалуйста, поправьте меня, если я ошибаюсь), как будто вы пытаетесь повторно реализовать что-то вроде Буферы протокола (protobufs).
Вы можете использовать комбинацию сообщений protobuf, вложенных сообщений и расширения чтобы достичь вашей цели.
Protobufs также легко конвертировано в & разобрали с текстовые и двоичные представления.