1

这里是深夜,我要疯了,试图解决链接器错误。

如果我有以下抽象接口:

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是一个抽象接口,所以只要我在具体(派生)接口中定义构造函数和析构函数就可以了,不是吗?好吧,看来不是。

4

3 回答 3

5

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

所以最简单的解决方案是提供内联实现:

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() {}
于 2010-05-21T09:26:35.833 回答
2

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

于 2010-05-21T09:26:39.720 回答
1

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

于 2010-05-21T09:24:07.867 回答