هل هذا الاستخدام الصحيح لـ Dynamic_cast؟
-
21-09-2019 - |
سؤال
لدي ثلاثة فصول: عام ، CFG ، والمقيّم.
هنا عام:
class Generic: public virtual Evaluator, public CFG, public LCDInterface {
هنا CFG:
class CFG : public virtual Evaluator {
والمقيّم فئات فرعية لا شيء.
أنا أقدم DLL المسماة البرنامج المساعد ، وله طريقة تسمى Connect:
void PluginLCD::Connect(Evaluator *visitor) {
visitor_ = dynamic_cast<Generic *>(visitor);
if(!visitor_)
return;
type_ = visitor_->GetType();
}
إليك كيف أقوم بتجميع DLL من خلال Scons:
env.SharedLibrary(['PluginLCD.cpp', 'Evaluator.cpp', 'Generic.cpp', 'CFG.cpp'])
الآن ، هناك سيناريوهان في الكود الخاص بي. واحد في الفصل LCDControl
, ، أي فئات فرعية CFG
. السيناريو الآخر أعلاه حيث Generic
فئات فرعية Evaluator
و CFG
. يحتوي المقيِّم على طريقة تسمى loadplugins ، والتي تفعل ما يقترحه اسمه ، تمريره this
من خلال DLL عبر الطريقة Connect
. حسنًا ، في السيناريو الأول Generic *
في الاتصال يجب أن تعود NULL
. ومع ذلك ، في السيناريو الثاني ، على حد علمي ، ينبغي إرجاع مؤشر صالح. لا يبدو أنه يحدث بهذه الطريقة. هل أنا مخطئ في هذا؟
المحلول
من المعروف أن Dynamic_cast يتخطى حدود الوحدة النمطية مع العديد من المترجمين (بما في ذلك MSVC و GCC). لا أعرف بالضبط سبب ذلك ، لكن Googling لأنه ينتج عنه الكثير من الزيارات. أوصي بمحاولة التخلص من Dynamic_cast في المقام الأول بدلاً من محاولة معرفة سبب عودتها إلى السيناريو الثاني.