سؤال

هل يمكنني تمرير "هذا" إلى وظيفة كمؤشر ، من داخل منشئ الفئة ، واستخدام نقطة في وجوه أعضاء قبل منشئ يعود ؟

هل هي آمنة للقيام بذلك ، طالما الوصول إليها أعضاء يتم تهيئة بشكل صحيح قبل أن وظيفة الدعوة ؟

كمثال:

#include <iostream>

class Stuff
{
public:
    static void print_number(void *param)
    {
        std::cout << reinterpret_cast<Stuff*>(param)->number;
    }

    int number;

    Stuff(int number_)
        : number(number_)
    {
        print_number(this);
    }
};

void main() {
    Stuff stuff(12345);
}

اعتقد ان هذا لن ينجح, ولكن على ما يبدو.هل هذا معيار السلوك ، أو السلوك غير معرف ذاهب في طريقي ؟

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

المحلول

عند إنشاء مثيل كائن في C ++، رمز في منشئ هو آخر شيء تنفيذها. جميع التهيئة الأخرى، بما في ذلك تهيئة الفائقة، تنفيذ منشئ الفائقة، وتخصيص الذاكرة يحدث مسبقا. التعليمات البرمجية في المنشئ هو في الحقيقة مجرد لأداء التهيئة إضافية مرة واحدة يتم إنشاء الكائن. لذلك هو صحيح تماما لاستخدام "هذا" المؤشر في منشئ فئة "ونفترض أنه يشير إلى كائن شيدت تماما.

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

نصائح أخرى

ويمكنك العثور على إجابة جيدة على هذا هنا (C ++ FAQ).

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

وومسكتك الرئيسي هو أنه لا ينبغي عليك استدعاء وظائف الظاهرية على this. معظم الأوقات لقد حاول هذا ينتهي حتى مجرد استدعاء الدالة الفئة الأساسية، ولكن أعتقد أن يقول معيار والنتيجة هي غير محددة.

وأما الجانب علما على رمز المقدمة، وأود أن بدلا templatize وvoid*:

class Stuff
{
public:
    template <typename T>
    static void print_number(const T& t)
    {
        std::cout << t.number;
    }

    int number;

    Stuff(int number_)
    : number(number_)
    {
        print_number(*this);
    }
};

وبعد ذلك كنت تحصل على خطأ ترجمة إذا لم يكن لديك نوع من t عضوا number.

أندي أعتقد أنك على خطأ عن غير معرفة جزء من معيار.

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

مزيد من المعلومات في C++ التعليمات لايت...

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