Tuesday, June 23, 2009

C++ Function Pointer

به نام دوست

به نظر من یکی از زیباترین قابلیتهای زبان C در کنار قابلیتهای گوناگون دیگر که نشان از ذوق و استعداد طراحان این زبان دارد اشاره‌گر به فانکشن است. شما میتوانید با استفاده از این قابلیت تابعی را که از محتوای پیاده‌سازی ان آگاه نیستید فقط با داشتن اشاره‌گر به آن و همچنین چینش و نوع پارامترهای آن و مقادار برگشتی تابع صدا بزنید.
به مثال زیر توجه کنید:
#include <iostream>
using std::cout;

class Test {
  public:

  int _fire(int x){

          cout << x << "\n";
          return 0;
  }

  int (Test::*fire)(int);

  void  fireMe()
  {
          (this->*fire)(23);
  }

  Test()
  {
          fire = &Test::_fire;
  }
};

int main()
{

  Test t;
  (t.*t.fire)(23);
}
عبارتی که بعد از .* و یا *<- قرار میگیرد، حاوی یک آدرس است. به عبارت دیگر عبارتی است که حاصل آن یک آدرس به فضای آدرس کلاس مورد نظر میباشد. و خلاصه کلام اینکه آنچه بعد از این عملگرهای می‌آید عنصر عضو کلاس نیست بلکه آدرس یک عضو کلاس میباشد.
 مثال زیر شیوه استفاده از آرایه‌ای از اشاره‌گرها به توابع را نشان میدهد:
#include <iostream>
#include <string>

using std::string;
class Test
{
public:
        typedef  string(Test::*action)(void *);

        string _test(void *) {
                std::cout << "test\n";

                return "";
        }
        Test() ;
        action action_list[2];
};

Test::Test() {
        action_list[0] = &Test::_test;
        (this->*action_list[0])(NULL);
}

main ()
{
        Test t; 
        (t.*t.action_list[0])(NULL);
}
اشاره‌گرها به توابع ابزار مناسبی جهت افزایش انعطافپذیری برنامه‌ها میباشند.