我正在为我的工作做一个项目,在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',这是非类类型'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/