gpt4 book ai didi

c++ - 无法访问我继承的类属性

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:44 24 4
gpt4 key购买 nike

我正在为我的工作开展一个项目,用 C++ 将 DNS 记录对象编码/解码到缓冲区中。有些记录具有相同的信息,因此我使用这些基本信息创建了一个类 Dns 消息:

class CDnsMessage
{
public:
CDnsMessage();
virtual ~CDnsMessage();

virtual int GetSize() = 0;
uint32_t m_ttl;
DnsClass dclass;
DnsType type;
std::string m_domain;
};

DnsClassDnsTypes 是我使用的不同类/类型的枚举。然后我有我的每条记录的子类,我将以 A 为例:

class CDns_RR_A : public CDnsMessage
{
public:
CDns_RR_A();

virtual ~CDns_RR_A();
virtual int GetSize(CDnsMessage const& msg);

uint32_t m_address;
};

然后我在另一个头文件 encoder.hencoder.cpp 中有我的编码/解码函数。

我正在接收一个 DnsMessage(对象)和接收缓冲区,然后我进行编码或解码。所以我使用动态转换来了解它是哪种类型的记录,并使编码和解码适应对象具有的变量。例如,这是我的解码:

EncodeResult DecodeData(const char * buffer,CDnsMessage & msg,std::size_t size)
{
EncodeResult res(ENCODE_OK);

uint32 ttl = 0;
eDnsClass dnsclass;
eDnsType dnstype;

//decoding RR_A
if(CDns_RR_A* RR_A_msg = dynamic_cast< CDns_RR_A* >( &msg ))
{
uint32_t address;

dnsclass = CLASS_IN;
msg.dclass = dnsclass;
dnstype = TYPE_A;
msg.type = dnstype;

res = DecodeInt32(&buffer,&size,&ttl);
CHECK_DECODE_ERROR(res);
msg.m_ttl = ttl;

res = DecodeInt32(&buffer,&size,&address);
CHECK_DECODE_ERROR(res);
msg.m_address = address;
}
}

DecodeInt32是很久以前人做的一个函数,它需要一个缓冲区(char**),一个size_t*和一个 uint32

我有两个问题,首先我无法访问我的子类的成员,当我编译时我遇到了 msg.dclass 或 msg.type 的问题并且它说“在'RR_A_msg'中请求成员'class',这是非类类型 'CDns_RR_A*'但我不明白,如果我的动态转换有效,这意味着收到的等待完成的消息是类型 A 否?

我的第二个问题是:我正在使用 uint32_t 作为 ttl(由企业强加)并且我的 decodeint32 使用 uint32 所以编译器说 从 uint32_t* 到 uint32 的无效转换

有没有办法把一个转换成另一个?

编辑:根据答案和建议更新了我的代码,现在我有了

if(dynamic_cast< CDns_RR_A* >( &msg ) != nullptr)
{
CDns_RR_A* RR_A_msg = dynamic_cast< CDns_RR_A* >( &msg )

uint32 address;

dnsclass = CLASS_IN;
RR_A_msg->dclass = dnsclass;
dnstype = TYPE_A;
RR_A_msg->type = dnstype;

res = DecodeInt32(&buffer,&size,&ttl);
CHECK_DECODE_ERROR(res);
RR_A_msg->m_ttl = ttl;

res = DecodeInt32(&buffer,&size,&address);
CHECK_DECODE_ERROR(res);
RR_A_msg->m_address = address;
}

将 uint32_t 更改为 uint32 以进行解码,并使用 RR_A_msg-> 代替 msg。也工作了。但是现在我有 undefined reference totypeinfo for CDns_RR_A'`

最佳答案

对于“您不能将 uint32_t* 转换为 uint32”,问题在于前者是指针而后者不是。您应该将 & 从前面去掉,并传递值而不是指向它的指针。

我不知道为什么你不能获取类成员(可能与使用保留名称作为变量有关?)但你不应该能够以这种方式访问​​ m_address。

代替

msg.m_address

你需要使用

RR_A_msg->m_address

关于c++ - 无法访问我继承的类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com