如果容器没有其实例,则访问嵌套类

时间:2017-02-06 16:03:30

标签: c++ class oop subclass

我有一个生成的.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 个答案:

答案 0 :(得分: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*>,即将*运算符应用于从类方法返回的指针的结果(实际上,结果是一个引用,但是& #39;与手头的问题没有密切关系。)

下一步:

(*(*d.packet()) - 这就是问题所在。 std::vector<packet_t *>显然不是可以应用*运算符的指针。它显然是一个载体。

这是编译错误的原因。