访问嵌套类(如果容器没有其实例)

Access a nested class if the container doesn't have its instance

本文关键字:实例 嵌套 如果 访问      更新时间:2023-10-16

我有一个生成的.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;
};

主要.cpp我创建了一个protocol_t d的对象,当然还有我尝试访问其温度的尝试

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

失败。packet_t根本没有datagram_t的例子,所以我无法达到它。虽然我想可以以某种方式完成。

让我们用纸和笔来计算这个表达式:

(*(*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 *>不是可以应用*运算符的指针。显然,它是一个载体。

这就是编译错误的原因。