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 に答える