سؤال

جميع الكائنات في برنامجي ترث من فئة الحاوية. يحتوي فئة الحاوية 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. ستشير مجموعة إلى مباراة يتم لعبها فيها.

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