عند الإعلان عن مؤشرات كائنات متعددة على نفس السطر، غالبًا ما يواجه المطورون مشكلة شائعة قد تؤدي إلى أخطاء المترجم. يعد فهم السبب الجذري لهذه المشكلة أمرًا بالغ الأهمية لضمان التنفيذ الصحيح للتعليمات البرمجية.
خذ بعين الاعتبار إعلان الفئة التالي:
public:
Entity()
{
re_sprite_eyes = new sf::Sprite();
re_sprite_hair = new sf::Sprite();
re_sprite_body = new sf::Sprite();
}
private:
sf::Sprite* re_sprite_hair;
sf::Sprite* re_sprite_body;
sf::Sprite* re_sprite_eyes;
في هذه الحالة، يضمن الإعلان عن كل مؤشر على حدة الأداء الوظيفي الصحيح. ومع ذلك، عند محاولة اختصار الإقرارات في سطر واحد:
private:
sf::Sprite* re_sprite_hair, re_sprite_body, re_sprite_eyes;
يثير المترجم خطأ:
error: no match for 'operator=' in '((Entity*)this)->Entity::re_sprite_eyes = (operator new(272u), (<statement>, ((sf::Sprite*)<anonymous>)))
يكمن مفتاح فهم هذا الخطأ في الغرض من عامل تشغيل العلامة النجمية (*). في لغة C، يمكن أن تشير العلامة النجمية إما إلى مؤشر أو إلى عملية إلغاء المرجع. في هذه الحالة، يجب أن تشير العلامة النجمية إلى مؤشرات لكائنات sf::Sprite. ومع ذلك، يفسر التصريح أعلاه بشكل غير صحيح العلامة النجمية على أنها تنطبق على re_sprite_body وre_sprite_eyes، مما يؤدي إلى إنشاء كائنات بدلاً من المؤشرات.
لحل هذه المشكلة، بناء الجملة الصحيح هو:
sf::Sprite *re_sprite_hair, *re_sprite_body, *re_sprite_eyes;
مع هذا التوضيح، يتم الإعلان عن كل مؤشر بشكل صحيح، مما يؤدي إلى حل خطأ المترجم وضمان الوظيفة المقصودة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3