C++ 如何在C++;

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) {

我正在尝试创建一个类,在这个类中,我们可以对char*中的不同结构进行编码和解码

我是这样做的我已经做了一个摘要 名为cangenericsg的泛型类,其cangenericsg.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
}
该类由实际类(如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>;