我正在为一个项目工作,目的是将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;
};
DnsClass
和DnsTypes
属于我使用的类/类型的枚举。然后,我有每个记录的子类,我将以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.h
和encoder.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'`
答案 0 :(得分:1)
对于“您不能将uint32_t *转换为uint32”,问题在于前者是指针,而后者则不是。您应该将&放在最前面,并将值而不是指针传递给它。
我不知道为什么不能获得类成员(可能与使用保留名称作为变量有关?),但是您不应该以这种方式访问m_address。
代替
msg.m_address
您需要使用
RR_A_msg->m_address