继承接口时未解析的符号

Unresolved symbol when inheriting interface

提问人:LeopardSkinPillBoxHat 提问时间:5/21/2010 更新时间:5/21/2010 访问量:2587

问:

现在是深夜,我快要疯了,试图解决链接器错误。

如果我有以下抽象接口:

class IArpPacketBuilder
{
public:

    IArpPacketBuilder(const DslPortId& aPortId);
    virtual ~IArpPacketBuilder();

    // Other abstract (pure virtual methods) here...
};

我是这样实例化的:

class DummyArpPacketBuilder
    : public IArpPacketBuilder
{

public:

    DummyArpPacketBuilder(const DslPortId& aPortId)
        : IArpPacketBuilder(aPortId) {}
    ~DummyArpPacketBuilder() {}
};

为什么我在链接时收到以下错误?

Unresolved symbol references:

IArpPacketBuilder::IArpPacketBuilder(DslPortId const&):
    ppc603_vxworks/_arpPacketQueue.o
IArpPacketBuilder::~IArpPacketBuilder():
    ppc603_vxworks/_arpPacketQueue.o
typeinfo for IArpPacketBuilder:
    ppc603_vxworks/_arpPacketQueue.o
*** Error code 1

IArpPacketBuilder是一个抽象接口,所以只要我在具体(派生的)接口中定义构造函数和销毁,我应该没问题,不是吗?好吧,似乎不是。

C++ 继承 接口 链接器 未解析外部

评论


答:

1赞 XAder 5/21/2010 #1

尝试内联它们 - 对我有用,尽管不知道这是否是好的解决方案

评论

0赞 LeopardSkinPillBoxHat 5/21/2010
您的意思是在IArpPacketBuilder中提供内联实现?
5赞 Péter Török 5/21/2010 #2

您只声明了 的构造函数和析构函数,而没有定义它们。链接器也需要定义。请注意,C++没有抽象接口的概念 - 是一个普通的旧类,它恰好包含一些纯虚方法,因此无法直接实例化。IArpPacketBuilderIArpPacketBuilder

因此,最简单的解决方案是提供内联实现:

class IArpPacketBuilder
{
public:

    IArpPacketBuilder(const DslPortId& aPortId) {}
    virtual ~IArpPacketBuilder() {}

    // Other abstract (pure virtual methods) here...
};

您也可以使析构函数成为纯虚拟的,但即便如此,您仍然需要为它提供定义,例如

class IArpPacketBuilder
{
public:

    IArpPacketBuilder(const DslPortId& aPortId) {}
    virtual ~IArpPacketBuilder() = 0;

    // Other abstract (pure virtual methods) here...
};

IArpPacketBuilder::~IArpPacketBuilder() {}

评论

0赞 LeopardSkinPillBoxHat 5/21/2010
我已经能够在另一个库中继承这个接口而没有任何问题,所以我认为这不会成为问题。我需要在抽象接口中定义它们吗?
0赞 Péter Török 5/21/2010
@Leopard,有趣。我认为它不会以这种方式工作 - 如果你显式声明一个构造函数/析构函数,编译器不会自动为你生成它。请注意,C++ 没有抽象接口的概念 - 您的类是一个带有一些纯虚方法的普通类,这使得它的直接实例化是不可能的。
0赞 LeopardSkinPillBoxHat 5/21/2010
谢谢,我通过定义 ctor 和 dtor 的主体来让它工作,但我仍然不明白为什么当我没有定义 ctor 和 dtor 时它在另一个库中工作。
0赞 LeopardSkinPillBoxHat 5/21/2010
我刚刚想通了。我有一个用于接口的 .cpp 文件,该文件确实定义了 ctor 和 dtor,但是当我从另一个库中的接口继承时,我没有链接到该 .cpp 文件,这就是我得到未解析符号的原因。愚蠢的错误!
0赞 Péter Török 5/21/2010
@Leopard,那就少了一个谜团......事物的秩序被恢复了:-)
2赞 anon 5/21/2010 #3

您需要提供定义 - 即抽象接口类的构造函数和析构函数的代码体 - 这两个函数都将在您的代码中使用,即使该类是抽象的。抽象类不是从不实例化的类,而是用户从不直接实例化的类。但是,它将由编译器实例化,编译器需要定义构造函数和析构函数。