2017-02-06 16 views
0

У меня есть сгенерированный файл .h, и я хочу получить доступ к одному из геттеров из main.cpp. Заголовок может показаться сложным:Доступ к вложенному классу, если контейнер не имеет своего экземпляра

#include <kaitai/kaitaistruct.h> 
#include <kaitai/kaitaistream.h> 

#include <stdint.h> 
#include <vector> 
#include <sstream> 

class protocol_t : public kaitai::kstruct 
{ 
private: 
    std::vector<packet_t*>* m_packet; 
    protocol_t* m__root; 
    kaitai::kstruct* m__parent; 

public: 
    class packet_t; 
    protocol_t(kaitai::kstream* p_io, kaitai::kstruct* p_parent = 0, protocol_t* p_root = 0); 
    ~protocol_t(); 
    std::vector<packet_t*>* packet() const { return m_packet; } 
    protocol_t* _root() const { return m__root; } 
    kaitai::kstruct* _parent() const { return m__parent; } 
}; 

class packet_t : public kaitai::kstruct 
{ 
private: 
    uint8_t m_pkt_id; 
    kaitai::kstruct* m_body; 
    protocol_t* m__root; 
    protocol_t* m__parent; 

public: 
    uint8_t pkt_id() const { return m_pkt_id; } 
    kaitai::kstruct* body() const { return m_body; } 
    protocol_t* _root() const { return m__root; } 
    protocol_t* _parent() const { return m__parent; } 

    class handshake_t; 
    class datagram_t; 

    packet_t(kaitai::kstream* p_io, protocol_t* p_parent = 0, protocol_t* p_root = 0); 
    ~packet_t(); 
}; 

class handshake_t : public kaitai::kstruct 
{ 

public: 
    std::string version() const { return m_version; } 
    protocol_t* _root() const { return m__root; } 
    protocol_t::packet_t* _parent() const { return m__parent; } 

    handshake_t(kaitai::kstream* p_io, protocol_t::packet_t* p_parent = 0, protocol_t* p_root = 0); 
    ~handshake_t(); 

private: 
    std::string m_version; 
    protocol_t* m__root; 
    protocol_t::packet_t* m__parent; 
}; 

class datagram_t : public kaitai::kstruct { 

public: 
    uint16_t left_time() const { return m_left_time; } 
    int8_t temperature() const { return m_temperature; } 
    protocol_t* _root() const { return m__root; } 
    protocol_t::packet_t* _parent() const { return m__parent; } 

    datagram_t(kaitai::kstream* p_io, protocol_t::packet_t* p_parent = 0, protocol_t* p_root = 0); 
    ~datagram_t(); 

private: 
    uint16_t m_left_time; 
    int8_t m_temperature; 
    protocol_t* m__root; 
    protocol_t::packet_t* m__parent; 
}; 

В main.cpp я создаю объект protocol_t г и, конечно же, мои попытки получить доступ к его температура

cout << (*(*d.packet())[0]->body())->temperature() << endl; 

терпит неудачу. В пакете_t просто нет экземпляра datagram_t, поэтому я не могу его достичь. Хотя я думаю, что это можно сделать как-то.

+1

*** cout << (* (* d.packet()) [0] -> body()) -> температура() << endl; *** Пожалуйста, не пишите производственный код так! – drescherjm

+0

Почему m_packet должен быть указателем на вектор? – drescherjm

+0

Несомненно. Я просто пытаюсь быстро и грязно получить поле. – Dankevich

ответ

2

Оценим это выражение, используя бумагу и ручку:

(*(*d.packet())[0] 

d.packet() возвращает std::vector<packet_t*> *:

std::vector<packet_t*>* packet() const { return m_packet; } 

Вот что он заявил вернуться. На следующий шаг:

*d.packet(), следовательно, дает вам std::vector<packet_t*>, результат применения оператора * к указателю возвращается из метода класса (на самом деле, результат является ссылкой, но это не имеет отношения к данному вопросу на рука).

Следующий шаг:

(*(*d.packet()) - и это проблема здесь. std::vector<packet_t *> - это, очевидно, не указатель, к которому может применяться оператор *. Это, очевидно, вектор.

В этом причина ошибки в вашей сборке.

+0

Но '(* d.packet()) [0] -> body() -> temperature()' doesn ' Обратите внимание, что body() также возвращает указатель. Я думал, что я разоблачил тело вторым '(* (* d.packet()) [0] ...)', а не вектором – Dankevich

+0

Я до сих пор не понимаю его. – Dankevich

+0

«Не работает» - это не очень полезное описание проблемы. Прежде всего, фактическое сообщение об ошибке вашего компилятора сообщит вам, в чем проблема. Хотя сообщения об ошибках компилятора C++ имеют репутацию за то, что вы сбиваете с толку, это не так. Следуя этой статье и карандашному подходу, вы должны иметь возможность легко найти ответ самостоятельно. Свободная подсказка: что возвращает 'body()'? Нет, не то, что вы *** хотите *** он должен вернуться, но что он на самом деле делает. Имеет ли он метод 'temperature()' Помните: компьютер выполнит только то, что вы ему скажете, а не то, что вы хотите. –