我看到了有关此问题的问题,但找不到任何适合我的解决方案。我正在使用带有 C++ 的 Visual Code,并且 C++ 版本早于 C++ 11。 我有 DNS 类,其中各种类继承主要 DNS 消息类,这样我可以分解一些属性。在类型类型字段的函数中我可以知道对象的类型。 当我编译时,我有一个错误“例如,对“DNS_RR_A的typeinfo”的 undefined reference ”,但我在每次检查对象的类时都得到了这个动态转换。
我的 dnsMessage.cpp 只有构造函数和析构函数。
这是我的类(class):
class CDnsMessage
{
public:
CDnsMessage();
virtual ~CDnsMessage();
virtual void GetSize() = 0;
uint32_t m_ttl;
eDnsClass m_class;
eDnsType m_type;
std::string m_domain;
uint8_t m_sizeDnsCorpse;
uint8_t m_sizeDomainName;
};
class CDns_RR_A : public CDnsMessage
{
public:
CDns_RR_A();
virtual ~CDns_RR_A();
virtual void GetSize() {/*....*/}
uint32_t m_address;
};
这是我的函数在动态转换时出现错误的示例。我收到一条必须编码的消息,但我不知道该消息的性质,因此我进行动态转换,以便调整我的编码:
//i receive a message i have to encode, i don't know the type
void EncodeOpaqueData(CDnsMessage & msg, std::vector<uint8_t>& output)
{
//where i encode
output.clear();
// Error : "undefined reference to `typeinfo for CDns_RR_A'"
if(dynamic_cast< CDns_RR_A* >( &msg ) != NULL)
{
CDns_RR_A* RR_A_msg = dynamic_cast< CDns_RR_A* >( &msg );
uint16_t dnstype = cmn_hton16(1);
output.push_back(dnstype);
output.push_back(dnstype >> 8);
/* stuff here */
uint32_t address = cmn_hton32(RR_A_msg->m_address);
for (int i = 0; i < 4; i++)
{
output.push_back(static_cast<uint8_t>(address >>(i * 8)));
}
}
}
在对函数进行更多思考之后,我可以检查 msg->m_type 并在该类型的函数中进行调整,而不是检查对象的类型,例如 m_type 变量可能会被错误地实例化。但无论如何我想了解这个错误以及如何修复它。 提前致谢。
最佳答案
类障碍(虚拟方法表和类型信息)是在编译第一个声明的虚拟方法时生成的。您是否定义虚拟 ~CDnsMessage();
(即 CDnsMessage::~CDnsMessage() {}
)以及它所在的文件定义包含在链接中。
请注意,外线定义并不弱,因此必须在一个源文件(而不是头文件)中定义它。
关于c++ - undefined reference "typeinfo for <class>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56538018/