C ++: تحويل غير صالح من "Basenode*" إلى "Match*"
-
19-08-2019 - |
سؤال
جميع الكائنات في برنامجي ترث من فئة الحاوية. يحتوي فئة الحاوية virtual BaseNode* getParent() const;
الطريقة و virtual void setParent(BaseNode *p);
طريقة.
انا املك Set
الفئة (تعيين في تطابق التنس ، وليس بنية بيانات) التي لديها Match
الفصل كما هو الوالد (عبر setParent()
) لكن منذ Set
يرث من Container
, ، يقوم البرنامج بإنشاء بنية شجرة من الأعلى إلى أسفل و Set
الفصل هو طفل ، لا يحتاج إلى أن يكون لديك طرق لتتبع وصيانة المعلومات حول الوالد وراء ماذا Container
يوفر.
الخطأ C++: invalid conversion from ‘BaseNode*’ to ‘Match*’
يظهر في الطريقة أدناه عندما أحاول تجميع برنامجي. ((Player* getPlayer1() const;
موجود فقط في Match
صف دراسي)
Player* Set::getPlayer1() const{
return getParent()->getPlayer1();
}
هذا هو بنية الميراث الخاصة بي للمباراة. (لاحظ أن TreeNode
هو قالب)
Match -> TreeNode<Set> -> BaseNode -> Container
لا أفهم لماذا أحصل على خطأ في المحادثة. لقد حاولت قراءة كتابي المدرسي لكنها مرجع ضعيف إلى حد ما. قدمت Google الكثير من المعلومات غير ذات الصلة.
يحرر
Player* Set::getPlayer1() const{
return dynamic_cast<Match>(getParent())->getPlayer1();
}
أسباب
error: cannot dynamic_cast ‘#‘obj_type_ref’ not supported by dump_expr#<expression error>((&((const Set*)this)->Set::<anonymous>))’ (of type ‘class BaseNode*’) to type ‘class Match’ (target is not pointer or reference)
تحرير 2
لقد أدركت للتو أنني بحاجة dynamic_cast<Match*>
الذي يعمل.
المحلول
المشكلة هي getParent()
إرجاع أ BaseNode*
, والتي يمكن أن تكون مؤشر لأي نوع من BaseNode
- قد يشير إلى فئة غير ذات صلة مستمدة أيضًا BaseNode
. إذا كنت متأكدًا بنسبة 100 ٪ من أن يكون الوالد من النوع Match
, ، يجب عليك إلقاء الوالد على Match*
أولاً ، ثم يمكنك الاتصال getPlayer()
على ذلك:
Player* Set::getPlayer1() const{
return dynamic_cast<Match*>(getParent())->getPlayer1();
}
إذا لم يكن الوالد ضروريًا Match
, ، ومن بعد dynamic_cast
قد تعود فارغة ، لذا تأكد من التحقق من ذلك.
نصائح أخرى
أعتقد أنك تحتاج حقًا إلى إعادة تنظيم أسماء التسلسل الهرمي والأسلوب الخاص بك ... هذا لا علاقة له بسؤالك ، ولكن بشكل عام يبدو من الصعب فهم سبب وراثة مجموعة من المباراة. (أليس من المباراة مجموعات؟)
تتألف الألعاب من نقاط ، وتتكون مجموعات من الألعاب وتتكون المباراة من مجموعات ... فازت بها لاعب.
ربما يجب أن تكون هيكله عن كثب إلى العالم الحقيقي.
فقط $ .02
تعديل
من المحتمل أن يكون لدي كائن مطابق يحتوي على خريطة للمجموعات (Map IE Set One أو Three أو ETC) و Method Player (int) بدلاً من player1 () و player2 (). كما أنه لا يبدو من الضروري أن يكون لديك طريقة للاعب في فئة SET. ستشير مجموعة إلى مباراة يتم لعبها فيها.