2017-02-06 43 views
0

我有一個生成的.h文件,我想從main.cpp訪問其中一個getter。頭看似複雜:如果容器沒有它的實例,訪問嵌套類

#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 d,當然我嘗試的對象來訪問它的溫度

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

失敗。 packet_t中根本沒有datagram_t的實例,所以我無法實現它。雖然我猜想它可以以某種方式完成。

+1

*** cout <<(*(* d.packet())[0] - > body()) - > temperature()<< 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()返回什麼?不,不是你想要的***它會返回,但它實際上做了什麼,它有一個'溫度()'方法嗎?記住:一臺計算機只會做你告訴它做的事情,而不是你想要做的事情。 –