C++ 如何在C++;
我正在尝试创建一个类,在这个类中,我们可以对char*中的不同结构进行编码和解码 我是这样做的我已经做了一个摘要 名为cangenericsg的泛型类,其cangenericsg.cpp为:C++ 如何在C++;,c++,generics,struct,can-bus,C++,Generics,Struct,Can Bus,我正在尝试创建一个类,在这个类中,我们可以对char*中的不同结构进行编码和解码 我是这样做的我已经做了一个摘要 名为cangenericsg的泛型类,其cangenericsg.cpp为: #include "CANgenericMsg.h" CANgenericMsg::CANgenericMsg() { // TODO Auto-generated constructor stub } void CANgenericMsg::decode(char* chars) {
#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
}
该类由实际类(如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>;
模板
类CANGenericMsg
{
公众:
cangenericsg(const T val):m_structureObj(val){}
无效解码(字符*字符)
{
T*数据=重新解释铸件(字符);
m_structureObj=*数据;
}
char*encode()
{
返回reinterpret_cast(&m_structureObj);
}
私人:
T m_结构对象;
};
struct structusortint{unsigned short int my_int;};
使用CANIntegerMsg=cangenericsg;
听起来(如果我错了,请纠正我)好像你在尝试重新实现(protobufs)之类的东西。
您可以使用protobuf消息、子消息和的组合来实现您的目标
ProtoBuf还可以轻松地进行文本和二进制表示。请考虑SWIG或类似XPCOM或DCE/RPC IDL的IDL。谢谢!我没有这样想过。我还有两个问题:1)Cangenericsg的构造函数到底发生了什么?老实说,我不熟悉这种语法。2) 在尝试构建时,我在“using CANIntegerMsg”行中遇到一个错误。错误:“CANIntegerMsg”之前应为嵌套名称说明符。”。在这种情况下,为什么需要一个预期的名称说明符?@DaanR,1)它用于初始化m_structureObj,我已将其更改为传统的复制构造函数。2) 请检查:它可以用大多数编译器编译。非常感谢您的帮助。很明显,我的编译器不是大多数编译器,但它似乎只是为了将“使用”行转换成“TyPulf CANGenericMsg CANIntegerMsg”,“DaANR啊,可能是一个旧的编译器,不支持C++ 11(我必须提一下):)DaANR,如果这个或任何答案已经解决了你的问题,请考虑。这表明你已经找到了一个解决方案,给回答者和你自己都带来了一些声誉。没有义务这么做。谢谢你的回答!从我所读到的内容来看,我认为这些protobuf是合适的,但在我看来,仅在这个示例中使用它们就会产生更多的复杂性。我认为AMA的“模板”答案看起来更容易实现。如果我不高兴,请纠正我wrong@DaanR实际上,如果只有一个简单的用法,那么最好滚动一个定制的实现,以避免向额外的库添加依赖项。如果您开始定义许多类型的消息,并且事情失控,请重新考虑使用标准解决方案:)
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>;