سؤال

نظرًا لأن معظم وظائف الراحة لـ QGraphicsScene و QGraphicsItem (مثل العناصر () ، CollidingItems () ، childitems () ، إلخ) ، تُرجع Qist التي تضطر إلى القيام بالكثير من QGraphicSitem_cast أو static_cast و qgraphicsitem :: type () احصل على العناصر الفعلية عندما يكون لديك الكثير من العناصر المختلفة في المشهد. اعتقدت أن القيام بالكثير من الممثلين من الفئات الفرعية لم يكن أسلوب ترميز مرغوب فيه ، لكنني أعتقد في هذه الحالة أنه لا توجد طريقة أخرى قابلة للحياة ، أم أن هناك؟

QList<QGraphicsItem *> itemsHit = someItem->collidingItems(Qt::IntersectsItemShape);
foreach (QGraphicsItem *item, itemsHit) {
    if (item->type() == QGraphicsEllipseItem::type()) {
        QGraphicsEllipseItem *ellipse = qgraphicsitem_cast<QGraphicsEllipseItem *>(item);
        // do something
    }
    else if (item->type() == MyItemSubclass::type()) {
        MyItemSubClass *myItem = qgraphicsitem_cast<MyItemSubClass *>(item);
        // do something
    }
    // etc
}

يمكن استبدال QGraphicsItem_Cast أعلاه بـ Static_cast حيث تم التحقق من النوع الصحيح بالفعل. عند القيام بالكثير من هذه الأوقات طوال الوقت (المشهد الديناميكي للغاية) ، هل سيؤثر الصب العديدة على الأداء بما يتجاوز التقييم العادي IF-ELSE؟

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

المحلول

الأداء النفقات العامة في الغالب مدفوعة مقدمًا ؛ إنها نتيجة الحمل من وجود.type() عضو. قد يكون من الفعال استرداد item->type() بمجرد. أنت تعلم أنه لا يتغير ، لكن احتمالات التحويل البرمجي لا.

تحرير] أيضا ، إذا كنت هل حقا لديك الكثير من الأنواع ، قد يكون من المفيد تقديم بعض الأنواع الوسيطة. على سبيل المثال. if (dynamic_cast<MyGraphicsInterMediateType*>(item)) {/* check those types */} else {/* other types */}

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