我正在为我的工作做一个项目,在C++中对缓冲区DNS记录对象进行编码/解码。有些记录具有相同的信息,因此我创建了一个类Dns消息,其中包含以下基本信息:

class CDnsMessage
{
public:
    CDnsMessage();
    virtual ~CDnsMessage();

    virtual int GetSize() = 0;
    uint32_t       m_ttl;
    DnsClass       dclass;
    DnsType        type;
    std::string    m_domain;
};

DnsClassDnsTypes是我使用的不同类/类型的枚举。然后我为每个记录都有我的子类,我将以A为例:
class CDns_RR_A : public CDnsMessage
{
public:
    CDns_RR_A();

    virtual ~CDns_RR_A();
    virtual int GetSize(CDnsMessage const& msg);

    uint32_t        m_address;
};

然后我在另一个报头中有编码/解码功能,encoder.hencoder.cpp
我正在接收一个DnsMessage(对象)和接收缓冲区,并进行编码或解码。所以我使用动态转换来了解它是哪种类型的记录,并根据对象的变量调整编码和解码。
下面是我的解码示例:
EncodeResult DecodeData(const char * buffer,CDnsMessage & msg,std::size_t size)
{
    EncodeResult res(ENCODE_OK);

    uint32 ttl = 0;
    eDnsClass dnsclass;
    eDnsType  dnstype;

    //decoding RR_A
    if(CDns_RR_A* RR_A_msg = dynamic_cast< CDns_RR_A* >( &msg ))
    {
        uint32_t address;

        dnsclass = CLASS_IN;
        msg.dclass = dnsclass;
        dnstype = TYPE_A;
        msg.type = dnstype;

        res = DecodeInt32(&buffer,&size,&ttl);
        CHECK_DECODE_ERROR(res);
        msg.m_ttl = ttl;

        res = DecodeInt32(&buffer,&size,&address);
        CHECK_DECODE_ERROR(res);
        msg.m_address = address;
    }
}

DecodeInt32是很久以前人们做的一个函数,它需要一个缓冲区(char**)、一个size_t*和一个uint32
我有两个问题,第一,我不能访问我的子类的成员,当我编译时,我遇到了msg.dclass或msg.type的问题,它说“请求成员'类'在'RR_a_msg',这是非类类型'CDns_RR_a*'
但我不明白,如果我的动态转换工作,这意味着收到的等待实现的消息是类型A否?
我的第二个问题是:我使用uint32_t作为ttl(由enterprise强制的),而我的decodeint32接受uint32,所以编译器说invalid conversion from uint32_t* to uint32
有没有机会把一个转变成另一个?
编辑:
更新了我的代码以下的答案和建议,现在我有
if(dynamic_cast< CDns_RR_A* >( &msg ) != nullptr)
                            {
                                    CDns_RR_A* RR_A_msg = dynamic_cast< CDns_RR_A* >( &msg )

                                    uint32 address;

                                    dnsclass = CLASS_IN;
                                    RR_A_msg->dclass = dnsclass;
                                    dnstype = TYPE_A;
                                    RR_A_msg->type = dnstype;

                                    res = DecodeInt32(&buffer,&size,&ttl);
                                    CHECK_DECODE_ERROR(res);
                                    RR_A_msg->m_ttl = ttl;

                                    res = DecodeInt32(&buffer,&size,&address);
                                    CHECK_DECODE_ERROR(res);
                                    RR_A_msg->m_address = address;
                            }

将uint32更改为uint32进行解码,并使用RR_A_msg->而不是msg。也起作用了。
但现在我有CDN的undefined reference to类型信息`

最佳答案

对于“您不能将uint32转换为uint32”,问题是前者是指针,而后者不是。您应该取下前面的&并传递值而不是指向它的指针。
我不知道为什么你不能得到类成员(可能与使用保留名称作为变量有关?)但你不应该用这种方式访问m U地址。
而不是

msg.m_address

你需要使用
RR_A_msg->m_address

关于c++ - 无法访问我继承的类属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56472186/

10-13 01:55