c++ - undefined reference "typeinfo for <class>"

标签 c++ linux

我看到了有关此问题的问题,但找不到任何适合我的解决方案。我正在使用带有 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/

相关文章:

c++ - 实现类型转换

c++ - 能否将一个类简单地传递给 CUDA 内核以进行并行评估?

linux - 如何编写 find 命令来删除包含所选 JPG 的 7 天前的文件?

可以附加到正在运行的进程的 C++ 探查器?

linux - 如何在 Ubuntu 中增加 Neo4j 的最大文件打开限制(ulimit)?

c++ - C Shell(cpp.sh,基于浏览器的编译器)正在运行 Visual Studio 不会运行的程序

c++ - 我可以使用模板别名作为模板模板参数吗?

c++ - 使用 MSYS2/Mingw32 编译 gRPC

python - 在本地安装 tkinter 和 python

linux - 循环遍历目录中的文件并使用 HEAD 命令