[英]can't access my inherited class attributes
我正在為我的工作在一個項目中進行編碼/解碼到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類型嗎?
我的第二個問題是:我在ttl中使用uint32_t
(由企業施加),而我的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
CDns_RR_A'的typeinfo有undefined reference to
對於“您無法將uint32_t *轉換為uint32”,問題是前者是指針,而后者則不是。 您應該將&放在最前面,並將值而不是指針傳遞給它。
我不知道為什么不能獲得類成員(可能與使用保留名稱作為變量有關?),但您不應該以這種方式訪問m_address。
代替
msg.m_address
您需要使用
RR_A_msg->m_address
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.