簡體   English   中英

無法訪問我繼承的類屬性

[英]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;    
};

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”中的成員“類”非類類型“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM