Неразрешенный символ при наследовании интерфейса - PullRequest
1 голос
/ 21 мая 2010

Здесь поздно ночью, и я схожу с ума, пытаясь устранить ошибку компоновщика.

Если у меня есть следующий абстрактный интерфейс:

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 - это абстрактный интерфейс, поэтому, пока я определяю конструкторы и деструкторы в конкретном (производном) интерфейсе, у меня все будет хорошо, нет? Ну, похоже, нет.

Ответы [ 3 ]

5 голосов
/ 21 мая 2010

У вас есть только объявленный конструктор и деструктор 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() {}
2 голосов
/ 21 мая 2010

Вы должны предоставить определения - то есть тела кода для конструктора и деструктора для абстрактного класса интерфейса - обе функции будут использоваться в вашем коде, даже если класс является абстрактным. Абстрактный класс - это не тот, который никогда не создается, а тот, который никогда не создается непосредственно пользователем. Однако он будет создан экземпляром компилятора, которому необходимо определить конструктор и деструктор.

1 голос
/ 21 мая 2010

попробуй встроить их - у меня работает, хотя не знаю, хорошее ли это решение

...