سؤال

يبدو هذا غير متناسق.لماذا نستخدم &Example::func بدلاً من Example::func؟هل هناك استخدام لـ example::func أو &exampleFunction؟لا يبدو أنه يمكننا الإشارة إلى دالة بحيث نستبعد المثال::func.ولا أستطيع التفكير في طريقة لاستخدام &exampleFunction نظرًا لأن exampleFunction يُرجع مؤشرًا بالفعل.

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
} 
هل كانت مفيدة؟

المحلول

لأن هذه هي الطريقة التي يحدد بها المعيار مؤشرات الوظائف.

يجب عليك دائمًا استخدام عامل العنوان & للحصول على مؤشر إلى وظيفة، ولكن بالنسبة للوظائف العادية ووظيفة العضو الثابت، يتم تعريف التحويل الضمني من وظيفة إلى مؤشر إلى وظيفة في المعيار.

لم يتم تعريف هذا لوظيفة عضو (غير ثابتة) لأنه لا يمكنك الحصول على قيمة لوظيفة عضو غير ثابتة.

من معيار C++:

4.3 التحويل من وظيفة إلى مؤشر

  1. يمكن تحويل lvalue من نوع الوظيفة t إلى rvalue من النوع "المؤشر إلى t." والنتيجة هي مؤشر للوظيفة.

مع الحاشية 52:

لا ينطبق هذا التحويل أبدًا على وظائف الأعضاء غير المنتظمة لأنه لا يمكن الحصول على عملية LVALUE التي تشير إلى وظيفة عضو غير منتظمة.

أعتقد أنهم يفضلون فقط السماح ب&الوظيفة، لأسباب تتعلق بالاتساق، ولكن التحويل الضمني هو مجرد قطعة أثرية من تراث لغة C...

نصائح أخرى

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

struct CL {
    int x, y, z;
};

bool sort_by_x(const CL& obj1, const CL& obj2);
bool sort_by_y(const CL& obj1, const CL& obj2);
bool sort_by_z(const CL& obj1, const CL& obj2);

...

CL obj[100];
...
sort(obj, obj+100, sort_by_x);
...
sort(obj, obj+100, sort_by_y);
...
sort(obj, obj+100, sort_by_z);

وهنا الأمراض المنقولة جنسيا :: نوع يستخدم لفرز مجموعة من الأشياء CL. نظرة على المعلمة الثالث، هو اسم وظيفة. وظيفة الأمراض المنقولة جنسيا :: نوع يمكن أن مؤشر دالة في المعلمة الثالث، واستخدام تلك الوظيفة كأساس للمقارنة لفرز مجموعة. فمن تصل لنا كيفية تحديد وظائف * sort_by_ بحيث الأمراض المنقولة جنسيا :: نوع يعمل كما هو متوقع.

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