我有一个生成的.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的实例,所以我无法达到它。虽然我想它可以以某种方式完成。
答案 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 *>
显然不是可以应用*
运算符的指针。它显然是一个载体。
这是编译错误的原因。