не могу получить доступ к моим унаследованным атрибутам класса - PullRequest
0 голосов
/ 06 июня 2019

Я работаю над проектом для моей работы по кодированию / декодированию в буферы объектов 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'`

1 Ответ

1 голос
/ 06 июня 2019

Для «вы не можете конвертировать uint32_t * в uint32» проблема заключается в том, что первый является указателем, а последний - нет. Вы должны взять & off спереди и передать значение, а не указатель на него.

Я не знаю, почему вы не можете получить члена класса (может быть, связано с использованием зарезервированного имени в качестве переменной?), Но вы не должны иметь доступ к m_address таким образом.

Вместо

msg.m_address

Вы должны использовать

RR_A_msg->m_address
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...