Я работаю над проектом для моей работы по кодированию / декодированию в буферы объектов DNS Records в C ++. Некоторые записи имеют одинаковую информацию, поэтому я создал сообщение класса 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 (навязанного предприятием), а мой decodeint32
берет uint32
, поэтому компилятор говорит invalid conversion from uint32_t* to uint32
.
Можно ли конвертировать один в другой?
Edit:
Обновил мой код после ответов и советов, теперь у меня есть
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 для декодирования сработало, и вместо msg было указано RR_A_msg->. работал тоже.
Но теперь у меня есть undefined reference to
typeinfo для CDns_RR_A'`