رمز لم يتم حله عند وراثة الواجهة
-
04-10-2019 - |
سؤال
إنه متأخر من الليل هنا وأنا مجنون بمحاولة حل خطأ في الارتباط.
إذا كان لدي الواجهة التجريدية التالية:
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() {}
نصائح أخرى
تحتاج إلى توفير تعريفات - أي أجسام رمز لكل من المُنشئ والمدمر لفئة الواجهة التجريدية - سيتم استخدام كلتا الوظيفتين في الكود الخاص بك ، على الرغم من أن الفصل مجردة. الفئة المجردة ليست فئة لا يتم تثبيتها أبدًا - فهي فئة لا مثيل لها من قبل المستخدم مباشرة. ومع ذلك ، سيتم إنشاء مثيل له بواسطة المترجم ، والذي يحتاج إلى تعريف المنشئ والمدمر.
جرب مضمّنهم - يعمل من أجلي على الرغم من أنه لا أعرف ما إذا كان حلًا جيدًا