无法访问我继承的类属性

时间:2019-06-06 06:47:11

标签: c++ linux dns

我正在为一个项目工作,目的是将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'中请求成员'class',非类类型“ CDns_RR_A *” 但我不明白,如果我的动态转换有效,则意味着等待执行的味精类型为A否?

第二个问题是:我使用uint32_t作为ttl(由企业强加),而我的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_t更改为uint32进行解码是可行的,并且使用RR_A_msg->而不是msg。也工作。 但是现在我有undefined reference to typeinfo了CDns_RR_A'`

1 个答案:

答案 0 :(得分:1)

对于“您不能将uint32_t *转换为uint32”,问题在于前者是指针,而后者则不是。您应该将&放在最前面,并将值而不是指针传递给它。

我不知道为什么不能获得类成员(可能与使用保留名称作为变量有关?),但是您不应该以这种方式访问​​m_address。

代替

msg.m_address

您需要使用

RR_A_msg->m_address