سؤال

ومؤخرا لقد تم تصميم مكتبة فئة الموضوع، لقد قدمت الموضوع فئة مجردة كما يلي:

class Thread {
public:
    run() { /*start the thread*/ }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int, void *) = 0;
};

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

والمشكلة هي أنني الاعتماد على مكتبة الخلفية C الذي يحدد تشغيل موضوع في الدالة التالية:

int startThread(char* name, (int)(*)(unsigned int, void*), int, int, int, void*);

وكما ترون. المعلمة الثانية هي مؤشر دالة إلى حلقة الترابط (وظيفة الرئيسية)، وهي المشكلة هنا. منذ أن استخدام هذا C-وظيفة لبدء موضوع في طريقة run، أمرر عنوان doOperation إلى المعلمة الثانية، وهذا لا يمكن القيام به، وذلك بسبب عدم تطابق نوع.

ولقد حاولت استخدام reinterpret_cast للعودة مؤشر، لكني ISO-C ++ يحرم عودة مؤشر عضو ظيفة تهيئة الامم المتحدة. أنا لا أعرف كيفية التغلب على هذا الصراع، وذلك باستخدام أسلوب ثابت هو الحل الوحيد أعتقد، ولكنه يفجر بلدي نمط تصميم!

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

المحلول

أولا، تأكد من قراءة الرابط المقدم مايكل بير، كما أنه يحتوي على معلومات جيدة. ثم، وهنا C ++ العش الزائفة رمز له:

int wrapperDoOperation(int v, void *ctx)
{
    Thread *thread = (Thread *)ctx;
    return thread->doOperation(v);
}

class Thread {
public:
    run() {
         startThread("bla", wrapperDoOperation, bla, bla, bla, (void *)this);
    }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int) = 0;

friend wrapperDoOperation ......;
};

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

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