سؤال

إنه متأخر من الليل هنا وأنا مجنون بمحاولة حل خطأ في الارتباط.

إذا كان لدي الواجهة التجريدية التالية:

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 هل واجهة مجردة ، طالما حددت المنشآت والتدمير في الواجهة الخرسانية (المشتقة) ، يجب أن أكون بخير ، لا؟ حسنًا ، لا يبدو.

هل كانت مفيدة؟

المحلول

لديك فقط أعلن مُنشئ ومدمر 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() {}

نصائح أخرى

تحتاج إلى توفير تعريفات - أي أجسام رمز لكل من المُنشئ والمدمر لفئة الواجهة التجريدية - سيتم استخدام كلتا الوظيفتين في الكود الخاص بك ، على الرغم من أن الفصل مجردة. الفئة المجردة ليست فئة لا يتم تثبيتها أبدًا - فهي فئة لا مثيل لها من قبل المستخدم مباشرة. ومع ذلك ، سيتم إنشاء مثيل له بواسطة المترجم ، والذي يحتاج إلى تعريف المنشئ والمدمر.

جرب مضمّنهم - يعمل من أجلي على الرغم من أنه لا أعرف ما إذا كان حلًا جيدًا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top