مزیت استفاده از تابع اشاره گر در C++ چیست؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۱۵۵ نفر آنلاین
۰ عضو و ۱۵۵ مهمان در سایت حاضرند

مزیت استفاده از تابع اشاره گر در C++ چیست؟

+4 امتیاز
293 بازدید
سلام دوستان. استفاده از تابع های به صورت اشاره گر در c++ چه مزیتی دارد؟

// Example program #include <iostream> using namespace std; int min(int a, int b); int main() { int (*point)(int x, int y); point = min; cout<<"minimum is " << point(32, 21); } int min(int a, int b) { return (a<b) ? a:b; }
سوال شده مرداد 19, 1393  بوسیله ی Pashmak (امتیاز 799)   2 7 29
مرتبط با http://goo.gl/JBnqwq
توضیحات خوبی داده بودید

2 پاسخ

+6 امتیاز
 
بهترین پاسخ

سلام .

فرض کنید مثلا شما یه کلاس Button درست میکنید به این شکل :

class Button
{
public:
	Button(int x,int y,int (*onclick) (void* ));
	virtual ~Button();

	void Func1 (void);
	void Func2 (void);
	void Func3 (void);
	void Func4 (void);
	.... .....	......

protected:
	int (*pfn_onclick) (void*);
	int x,y;
	.....
	.....
};

که این کلاس یه دکمه هست که رو یه Form یا Dialog ایجاد میشه . و شما میخواهید چند تا دکمه رو فرمتون درست کنید . و میخواهید هر دکمه وقتی که روش کلیک میشه کار خاصی رو انجام بده . پس شما از کاربر یک اشاره گر به یک تابع رو میگیرید که هر وقت روی دکمه کلیک شد اون اشاره گر به تابع رو صدا کنه .

حالا دو تا نمونه از کلاس Button درست میکنید . که یکی برای مثال عمل خروج رو داره و یکی عمل اینکه فقط یک پیغام رو نشون بده .

حالا ۲ تا تابع یکی برای خروج و یکی برای نشان دادن پیغام درست میکنید و آدرس اون رو به نمونه های ساخته شده میدید .

و حالا هر دکمه ای که روش کلیک بشه اون اشاره گر به تابع رو صدا میکنه . و اون اشاره گر هم به تابع مورد نظری که شما بهش دادین اشاره میکنه .

البته این فقط یک مثال هست . که چطوری یک اشاره گر به تابع میتونه کاربرد داشته باشه .

پاسخ داده شده مرداد 19, 1393 بوسیله ی Ali Rahbar (امتیاز 4,809)   5 14 46
بابت پاسخ ممنون.آیا به جای اشاره گر به تابع نمی توان خود تابع را مستقیما فراخوانی کرد؟ آیا استفاده از اشاره گر به تابع باعث میشه حافظه کمتری مصرف بشه؟ سرعت بالاتر بره؟ در ضمن کلمه virtual که در کلاس button نوشته شده چه عملی را انجام میده؟
ببینید کلاس Button فقط اشاره گر رو صدا میکنه و اصلا کاری نداره که این اشاره گر به چه تابعی هست . دلیل استفاده از اشاره گر به تابع همین هست . کلاس Button اینطور عمل میکنه که وقتی متوجه شد که روی دکمه کلیک شده هر کاری که شما مناسب میدونید رو انجام بده . برای همین از اشاره گر به تابع استفاده میکنه و شما میتونید اون اشاره گر رو به هر تابعی که دوست دارید ارتباط بدید تا وقتی که اون اشاره گر صدا زده میشه ، تابعی که شما آدرسشون بهش دادید صدا زده بشه .
در واقعا اشاره گر به تابع یه تابع مجهول هست که میتونه هرچیزی باشه و شما تعیینش میکنید . در مورد سوالتون اینو بگم که اگه کلاس Button بخواد تابع خواصی رو صدا بزنه دراینصورت شما نمیتونید تعیین کنید که هنگام کلیک شدن رو دکمه کار دیگه ای انجام بشه . در مورد حافظه هم نه هیچ فرقی نداره . سرعت هم بالاتر نمیره . کلمه Virtual مبحث دیگه ای هست که باید توی سایت دنبالش برگردی ، اگه هم نبود در موردش سوال بپرس . ولی اینجا توی کلاس Button یک Virtual Destructor تعریف شده . اینجا رو ببین :
http://www.7khatcode.com/index.php?qa=1683&qa_1=%D9%85%D8%AE%D8%B1%D8%A8-%DB%8C%D8%A7-desutructor-%DA%A9%D9%84%D8%A7%D8%B3-%D8%A8%D9%87-%D8%B4%DA%A9%D9%84-virtual
بابت وقتی که گذاشتید ممنون
خواهش میکنم برادر.
+2 امتیاز

برای ایجاد thread  جدید باید تابع مربوط به thread  با اشاره گره به تابع داده بشه (C++11 رو نمی‌ونم این طوریه یا نه). اگه بخواید یه آرایه از تابع‌ها داشته باشید هم همین طور.

کاربرد اصلیش در دادن تابع به عنوان آرگومان/پارامتر تابع دیگه س. اما آشنا بودن باهاش می‌تونه گاهی کمک کنه به 

این برنامه ماهیت اشاره گر به تابع ها رو نشون می‌ده

#include <iostream>
using namespace std;
void f(int a, int b)
{
    cout<< a + b << endl;
}
int main()
{
    void (*pf)(int,int) = f; //  =&f;
    void (**ppf)(int,int) = &pf;
    cout<<(**ppf == *ppf) << "\n";     // true
    // cout<<( &(**ppf) == &(*ppf) ) << "\n"; // false // error in gcc
    // ppf = f; // error
    cin.get();
}
پاسخ داده شده مرداد 19, 1393 بوسیله ی irancplusplus (امتیاز 321)   1 2 14
c++11 هم همین طوره البته std::thread لامبدا و std::function هم قبول می کنه
...