سؤال

انا استخدم Visual Studio 2003 لتجميع وتشغيل البرنامج التالي.

هناك 4 عملية مهمة حيث أتوقع 2 منها تشغيل موافق و 2 منها لرفع الاستثناء. هناك صب ديناميكي داخل الزائد = operator الذي يتوقع أن تفشل خلال الصب الصليب غير المناسب (صب من Apple ل Orange أو Orange ل Apple). ولكن في حالتي، تفشل جميع العمليات الأربعة (زيادة الاستثناء). لقد قمت بتشغيل نفس الكود في Visual Studio 2008 ويعمل بشكل جيد كما هو متوقع. ولكن نقل مشروع كامل ل Visual Studio 2008 صعب. هل هذه مشكلة Visual Studio 2003ب إذا كان الأمر كذلك، هل هناك أي طريقة لإصلاح هذا؟

ملاحظة: الفئة Fruit تتم قراءة فقط ولا يمكن تغييرها.

class Fruit
{
public:
    virtual void operator = ( const Fruit& fruit )
    {
    }
};

class Apple : public Fruit
{
public:
    virtual void operator = ( const Fruit& fruit )
    {
        Apple& apple = dynamic_cast<Apple&>( fruit );
    }
};

class Mango : public Fruit
{
public:
    virtual void operator = ( const Fruit& fruit )
    {
        Mango& mango = dynamic_cast<Mango&>( fruit );
    }
};

int main( void )
{
    Apple apple;
    Mango mango;
    Fruit* fruit[] = { &apple, &mango };

    *fruit[0] = *fruit[0]; /* Expect to work ok */
    *fruit[0] = *fruit[1]; /* Expect an exception */
    *fruit[1] = *fruit[0]; /* Expect an exception */
    *fruit[1] = *fruit[1]; /* Expect to work ok */
}
هل كانت مفيدة؟

المحلول

تحتاج إلى التحقق Enable Run-time type information (RTTI) في إعدادات المشروع. الفئة "C ++ لغة".

في VC6 على الأقل لن يتم تمكينه بشكل افتراضي.

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