سؤال

النظر في الرمز التالي:

const QString& MyClass::getID(int index) const
{
    if (i < myArraySize && myArray[i]) {
        return myArray[i]->id; // id is a QString
    } else {
        return my_global_empty_qstring; // is a global empty QString
    }
}

كيف يمكنني تجنب أن يكون لديك QString فارغ دون تغيير نوع الإرجاع للطريقة؟ (يبدو أن إرجاع QString فارغ المخصص على المكدس هو فكرة سيئة)

شكرًا.

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

المحلول

لا يمكنك. إما عدم إرجاع مرجع const أو استخدم متغيرًا ثابتًا محليًا مثل هذا:

const QString& MyClass::getID(int index) const {
    if (i < myArraySize && (myArray[i] != 0)) {
        return myArray[i]->id; // id is a QString
    }

    static const QString emptyString;
    return emptyString;
}

ميزة هذه الطريقة على الطرق المقترحة الأخرى هي أن هذا الحل لا يتطلب تغييرًا في واجهة MyClass. علاوة على ذلك ، قد يؤدي استخدام معلمة افتراضية إلى إرباك مستخدمي الفصل الخاص بك ويؤدي إلى استخدام فئة خاطئ. هذا الحل شفاف للمستخدم.

بالمناسبة ، هل تستخدم حقًا صفيف نمط C في صفك؟

نصائح أخرى

بما أنه من المتوقع أن يعيد أ const لا أرى أي مشكلة في وجود QString فارغة (أو ثابتة) QString فارغة يتم استخدامها من قبل جميع هذه الوظائف لإرجاع سلسلة فارغة.

أنا لست متوحشًا على الاسم رغم ذلك. أتوقع أن يكون QString "الفارغ" عضوًا ثابتًا في فئة QString. لذا فإن الكود الخاص بك سيبدو هكذا بدلاً من ذلك.

const QString& MyClass::getID(int index) const
{
    if (i < myArraySize && myArray[i]) {
        return myArray[i]->id; // id is a QString
    } else {
        return QString::EmptyString; // is a global empty QString
    }
}

لا يمكنك تجنب ذلك دون تغيير نوع العودة.

إذا اخترت إرجاع مرجع ، فأنت يجب لديك بعض المتغيرات من نوع الإرجاع الذي يفوق نطاق الوظيفة. إذا لم تتمكن من تغيير واجهة برمجة التطبيقات (على سبيل المثال بسبب وعود التوافق الثنائي) ، فأنت مغلق بهذا إلى الأبد. سيكون عليك أن تضيع الذاكرة في تخزين بعض قيمة النوع ذي الصلة ، حتى إذا قمت بتغيير بقية تطبيق الفصل الخاص بك لإنشاء القيم الموجودة على الطيران أو استردادها من مصدر خارجي.

هذا هو السبب const& دون دراسة متأنية.

ماذا عن استخدام القيمة الافتراضية مسبقًا:

const QString& MyClass::getID(int index, const QString& def = QString()) const
{
    if (i < myArraySize && myArray[index]) {
        return myArray[index]->id; // id is a QString
    } else {
        return def;
    }
}

إذا أصرت على إرجاع مرجع ، فيجب أن يكون لديك كائن للإشارة إليه ؛ لذلك يجب أن يكون لديك كائن QString في مكان ما في مثالك ، لا توجد طريقة للتغلب عليه.

ومع ذلك ، فإن التقنية التي تبدو مناسبة لحالتك هي تغيير طريقتك لقبول معرف افتراضي للعودة في حالة خروج الفهرس:

const QString& MyClass::getID( int i, const QString& default ) const
{
  if( i < myArraySize && myArray[i] )
    return myArray[i]->id;
  else
    return default;
}

يمكنك أيضًا إلقاء استثناء إذا كان الفهرس خارج النطاق ، فلن تحتاج إلى العودة فعليًا إلى الفشل ولكن هذا ربما لا يكون ما تريده.

هل تكفي QString :: Null؟

لا يمكنك تجنب الحاجة إلى QString فارغة دون تغيير الطريق getId() يعمل. ولكن هناك طريقتان في الربيع إلى الذهن:

  • بدلاً من إرجاع سلسلة فارغة بصمت ، قم بإلقاء استثناء ؛ أو
  • لا تهتم بإعادة مرجع ، وإعادة QString فقط ، معتمدًا تحسين قيمة الإرجاع للتخلص من تكلفة نسخ الكائن.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top