سؤال

حسنًا ، أحصل على خطأ (رمز خارجي لم يتم حله) عند القيام بما يلي:

- لدي فئة "كائن" - يتم تعريفه في "Object.h".

لديها مُنشئ مثل: explicit Object(double x, /* lots more */);

في ملف "Object.cpp" أريد أن أعطي هذا المُنشئ جسمًا: Object::object(double x) : _x(x) {}

هذا يعمل .. ومع ذلك ، إذا قمت بإضافة الكلمة الرئيسية "INLINE" في ملف "Object.cpp":

inline Object::Object(double x) : _x(x) {}

فجأة يبرز خطأ الرابط! "خطأ LNK2019: رمز خارجي لم يتم حله"

لماذا ا؟ - هل هذا يعني أنه لا يمكنني استخدام الإضفاء الطويلة على المُنشئين؟

تحرير: في الواقع لاحظت أن هذا هو الحال بالنسبة لجميع الطرق. لكن إذا قمت بنقل جميع الطرق إلى Object.H رأس فيل ينجح. لا يمكنك مضمنة الوظيفة من ملف الرأس خارج حيث يتم تعريف الكائن؟

EDIT2: حسناً تحديثًا كبيرًا ، قررت إنشاء حالة اختبار سريعة:
Main.cpp:

#include "a.h"
int main ()
{
    a t;
    t.test(5);
    return 0;
}

آه

class a {
public:
    void test (int x);
};

A.CPP

#include <iostream>
#include "a.h"
inline void a::test(int x) {
    std::cout << x << std::endl;
}

هذا يعطي الخطأ التالي:

Main.Obj: خطأ LNK2019: الرمز الخارجي غير المحلول "العام: void __thiscall a :: test (int)" (؟ test@a qaexh@z) المشار إليها في الدالة _main

إن إزالة الكلمة الرئيسية "المضمّنة" تجعل البرنامج يعمل .. وكذلك الجمع بين "AH" و "A.CPP" في ملف واحد.

لا يمكنني حقًا التفكير في مزيد من المعلومات لإعطاء:/

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

المحلول

تحتاج إلى فهم قواعد التعريفات الخاصة بالوظائف المحددة inline.

وضع علامة على وظيفة inline يعني أنه يمكنك تحديد الوظيفة في أكثر من وحدة ترجمة واحدة في البرنامج (ولكن مرة واحدة فقط لكل وحدة ترجمة) ولكن يجب أن تكون جميع التعريفات هي نفسها وأنت يجب توفير تعريف في كل وحدة ترجمة يتم فيها استخدام الوظيفة.

في مثالك وحدة الترجمة من main.cpp الاستخدامات a::test(int) ولكن لا يوجد تعريف في وحدة الترجمة هذه. هناك تعريف في وحدة الترجمة من a.cpp ولكن هنا تم وضع علامة inline مما يعني أنه لا يمكنك ترك تعريف من وحدة الترجمة من main.cpp.

لست متأكدًا لماذا تريد إضافة inline إلى التعريف في a.cpp لأنها ليست ضرورية أو مفيدة. inline يتيح لك وضع تعريفات الوظائف في ملفات الرأس المشتركة ولكن لا فائدة منها إذا كنت ترغب في وضع الوظيفة في ملف مصدر.

نصائح أخرى

لديك حالة أقل o في اسم المنشئ في الكود ، سواء كان ذلك أم لا. أسماء C ++ حساسة للحالة.

جرب هذا:

inline Object::Object(double x) : _x(x) {}

أنا لست واضحا ما تعنيه /* lots more */ التعليق في الكود الذي نشرته. إذا كان لديك معلمات أخرى في هذا الإعلان ، فيجب أن يتطابق تعريف المنشئ.

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

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