C++ সদস্য ফাংশন পয়েন্টার

C Sadasya Phansana Payentara



C++ এ, মেম্বার ফাংশন পয়েন্টার একটি ক্লাসের মধ্যে মেম্বার ফাংশন উল্লেখ করতে সাহায্য করে। তারা একটি ক্লাসের একটি উদাহরণে সদস্য ফাংশন সংরক্ষণ এবং কল করার একটি উপায় প্রদান করে, বিভিন্ন পরিস্থিতিতে নমনীয়তা এবং প্রসারণযোগ্যতা অবদান রাখে। সদস্য ফাংশন পয়েন্টারগুলির একটি সাধারণ ব্যবহার হল যখন রানটাইম অবস্থার উপর ভিত্তি করে স্বতন্ত্র আচরণগুলি ট্রিগার করা আবশ্যক। একটি অ্যাপ্লিকেশন গতিশীলভাবে সদস্য ফাংশন পয়েন্টার ব্যবহার করে উপযুক্ত আচরণ নির্বাচন এবং কল করতে পারে। অতিরিক্তভাবে, সদস্য ফাংশন পয়েন্টারগুলি এমন পরিস্থিতিতে সহায়ক যেগুলির সিস্টেমের উপাদানগুলির ডিকপলিং প্রয়োজন৷

উদাহরণ 1:

সংজ্ঞায়িত ফাংশন ব্যবহার করা সহজ করার জন্য আমরা 'iostream' হেডার ফাইলটি অন্তর্ভুক্ত করি। তারপর, আমাদের 'নেমস্পেস std' আছে। এর নিচে, আমরা 'MyNewClass' নামের ক্লাস তৈরি করি এবং 'পাবলিক' কনস্ট্রাক্টর ব্যবহার করি।

'পাবলিক'-এ, আমরা 'myFunc' নামে সদস্য ফাংশন তৈরি করি এবং 'myFunc()'-এর প্যারামিটার হিসেবে 'int num' ঘোষণা করি। এর নীচে, আমরা 'cout' ব্যবহার করি এবং এর নীচে main() মেথডটি চালু করি যাতে আমরা মেম্বার ফাংশন পয়েন্টার তৈরি করি। আমরা সদস্য ফাংশন টাইপের জন্য 'MyFuncPtr' পয়েন্টার ঘোষণা করি, 'MyNewClass' ক্লাস এবং প্যারামিটার টাইপ (int) উল্লেখ করে।







এর পরে, আমরা 'Class_obj' নামে একটি ক্লাস অবজেক্ট তৈরি করি এবং তারপর এটির সাথে ক্লাস অবজেক্ট স্থাপন করে '*MyFuncPtr' পয়েন্টারের সাহায্যে সদস্য ফাংশনটিকে কল করি। যখন আমরা সদস্য ফাংশন পয়েন্টারকে কল করি তখন আমরা এটি রেন্ডার করার জন্য প্যারামিটার হিসাবে '10' নির্ধারণ করি।



কোড 1:

# অন্তর্ভুক্ত করুন

নামস্থান std ব্যবহার করে ;

ক্লাস MyNewClass {

সর্বজনীন :

অকার্যকর myFunc ( int একের উপর ) {

cout << 'মান হল' << একের উপর << endl ;

}

} ;

int প্রধান ( ) {

অকার্যকর ( মাইনিউক্লাস ::* MyFuncPtr ) ( int ) = এবং মাইনিউক্লাস :: myFunc ;

MyNewClass Class_obj ;

( ক্লাস_অবজে * MyFuncPtr ) ( 10 ) ;

ফিরে 0 ;

}

আউটপুট:



এটি সদস্য ফাংশন পয়েন্টারগুলির কাজকে চিত্রিত করে। সদস্য ফাংশন পয়েন্টার বর্তমান অবস্থা অনুযায়ী সদস্য ফাংশন গতিশীলভাবে চালু করতে ব্যবহার করা যেতে পারে।





উদাহরণ 2:

'iostream' শিরোনাম ফাইলে সংজ্ঞায়িত ফাংশনগুলি ব্যবহার করার জন্য, আমরা এখানে 'iostream' অন্তর্ভুক্ত করি। 'নেমস্পেস std' পাশে রাখা হয়েছে। এটির নীচে, আমরা 'পরীক্ষা' ক্লাস তৈরি করি এবং তারপর 'পাবলিক' কনস্ট্রাক্টর ব্যবহার করি। আমরা ' myTestingFunc ' সদস্য ফাংশনকে 'পাবলিক'-এ সংজ্ঞায়িত করি এবং এই উদাহরণে 'myTestingFunc()'-এর প্যারামিটার হিসাবে 'int t_value' সেট করি। নিচে 'cout' ফাংশন ব্যবহার করা হয়েছে এবং main() মেথড বলা হয়েছে। তারপরে, আমরা সদস্য ফাংশন পয়েন্টার তৈরি করি।



আমরা এখানে 'Test' ক্লাস এবং '*MyTestFuncPtr' সদস্য ফাংশন পয়েন্টার উল্লেখ করি। আমরা সদস্য ফাংশন পয়েন্টারে '&Test::myTestingFunc' বরাদ্দ করি যেটিকে 'অকার্যকর (Test::*MyTestFuncPtr)(int)' হিসাবে ঘোষণা করা হয়েছে।

এর পরে, আমরা 't_obj' ক্লাস অবজেক্ট তৈরি করি এবং ক্লাস অবজেক্ট রেখে এবং '*MyTestFuncPtr' পয়েন্টার ব্যবহার করে সদস্য ফাংশন কল করতে এটি ব্যবহার করি। এটি উপস্থাপন করার জন্য যখন আমরা সদস্য ফাংশন পয়েন্টার কল করি, আমরা প্যারামিটার হিসাবে '932' নির্ধারণ করি।

কোড 2:

# অন্তর্ভুক্ত করুন

নামস্থান std ব্যবহার করে ;

ক্লাস টেস্ট {

সর্বজনীন :

অকার্যকর myTestingFunc ( int টি_মান ) {

cout << 'পরীক্ষার মান হল' << টি_মান << endl ;

}

} ;

int প্রধান ( ) {

অকার্যকর ( পরীক্ষা ::* MyTestFuncPtr ) ( int ) = এবং পরীক্ষা :: myTestingFunc ;

পরীক্ষা t_obj ;

( t_obj * MyTestFuncPtr ) ( 932 ) ;

ফিরে 0 ;

}

আউটপুট:

প্রদত্ত কোডের ফলাফল রেন্ডার করা হয়। আমরা দেখতে পাচ্ছি যে আমরা এখানে দেখানো ক্লাস অবজেক্টের সাথে 'মেম্বার ফাংশন পয়েন্টার' বলেছি।

উদাহরণ 3:

এই কোডে আমরা যে ক্লাসটি তৈরি করি তা হল 'MyNewCar' যেখানে আমরা 'পাবলিক' কনস্ট্রাক্টর ব্যবহার করি এবং এতে সদস্য ফাংশন তৈরি করি যা 'startCarEngine()'। এই ফাংশনে, আমরা 'cout' যোগ করি যা আমাদের কোডে এই ফাংশনটিকে কল করলে রেন্ডার হয়। তারপর, আমরা আরেকটি মেম্বার ফাংশন তৈরি করি যা হল “stopCarEngine()” এবং এই মেম্বার ফাংশনে আবার “cout” ব্যবহার করি।

এর পরে, আমরা main() ফাংশনটি চালু করি এবং তারপর সদস্য ফাংশন পয়েন্টার ঘোষণা করি যা 'MyNewCar::*careEngineFunc()'। এর নিচে, আমরা 'myCar_obj' নামের সাথে 'MyNewCar' ক্লাস অবজেক্ট তৈরি করি। তারপর, আমরা 'carEngineFunc' পয়েন্টারে 'startCarEngine' ফাংশন বরাদ্দ করি। এর নীচে, আমরা এই ফাংশনটিকে 'careEngineFunc' পয়েন্টারের সাহায্যে এটির সাথে বস্তুর নাম রেখে কল করি।

এরপরে, আমরা 'stopCarEngine' ফাংশনটিকে 'careEngineFunc' পয়েন্টারে পুনরায় বরাদ্দ করি। এর নীচে, আমরা এই ফাংশনটিকে 'carEngineFunc' রেফারেন্সের সাথে একত্রে অবজেক্টের নাম পাস করে কল করি।

কোড 3:

# অন্তর্ভুক্ত করুন

নামস্থান std ব্যবহার করে ;

ক্লাস MyNewCar {

সর্বজনীন :

অকার্যকর স্টার্ট কেয়ার ইঞ্জিন ( ) {

cout << 'গাড়ির ইঞ্জিন শুরু হয়' << endl ;

}

অকার্যকর স্টপ কেয়ার ইঞ্জিন ( ) {

cout << 'গাড়ির ইঞ্জিন থেমে গেছে' << endl ;

}

} ;

int প্রধান ( ) {

অকার্যকর ( মাইনিউকার ::* carEngineFunc ) ( ) ;

MyNewCar myCar_obj ;

carEngineFunc = এবং মাইনিউকার :: স্টার্ট কেয়ার ইঞ্জিন ;

( myCar_obj. * carEngineFunc ) ( ) ;

carEngineFunc = এবং মাইনিউকার :: স্টপ কেয়ার ইঞ্জিন ;

( myCar_obj. * carEngineFunc ) ( ) ;

ফিরে 0 ;

}

আউটপুট:

এখানে, 'সদস্য ফাংশন পয়েন্টার' এর কাজ প্রদর্শিত হয়। আমরা দেখতে পাচ্ছি যে আমরা সদস্য ফাংশন পয়েন্টার তৈরি করেছি এবং ফলাফল এখানে প্রদর্শন করেছি।

উদাহরণ 4:

হেডার ফাইল এবং 'std নেমস্পেস' অন্তর্ভুক্ত করার পরে, আমরা এখানে 'MyNewStudent' ক্লাস ঘোষণা করি। 'studentPass()' সদস্য ফাংশন হল সদস্য ফাংশনগুলির মধ্যে একটি যা আমরা 'MyStudentClass' ক্লাসের জন্য তৈরি করি যা আমরা এখানে তৈরি করি। আমরা এই ফাংশনে 'cout' যোগ করি যা আমাদের কোডে কল করলে রেন্ডার হবে।

এর পরে, আমরা 'studentFail()' সদস্য ফাংশন লিখি যেখানে আমরা আবার 'cout' ব্যবহার করি। তারপর main() ফাংশনটিকে কল করা হয় এবং “(MyNewStudent::*studentResultFunc)()” সদস্য ফাংশন পয়েন্টার ঘোষণা করা হয়। এর নীচে, আমরা 'myStd_obj' অবজেক্ট তৈরি করি যা 'MyNewStudent' ক্লাসের অন্তর্গত।

এরপরে, আমরা 'studentPass' ফাংশনটি 'studentResultFunc' পয়েন্টারে বরাদ্দ করি। এর নীচে, আমরা এই ফাংশনটিকে 'studentResultFunc' রেফারেন্সের সাথে একত্রে অবজেক্টের নাম পাস করে কল করি। 'studentFail' ফাংশনটি ' studentResultFunc ' পয়েন্টারে পুনরায় বরাদ্দ করা হয়েছে৷ এর নীচে, আমরা 'carEngineFunc' রেফারেন্স এবং বস্তুর নাম দিয়ে এই পদ্ধতিটি চালু করি।

এখন, উভয় ফাংশন এখানে বলা হয় এবং আমরা এই ফাংশনগুলির মধ্যে যে বিবৃতিগুলি অন্তর্ভুক্ত করেছি তা রেন্ডার করা হয়।

কোড 4:

# অন্তর্ভুক্ত করুন

নামস্থান std ব্যবহার করে ;

ক্লাস MyNewStudent {

সর্বজনীন :

অকার্যকর ছাত্রপাস ( ) {

cout << 'ছাত্র পাস' << endl ;

}

অকার্যকর ছাত্র ফেল ( ) {

cout << 'ছাত্র ব্যর্থ' << endl ;

}

} ;

int প্রধান ( ) {

অকার্যকর ( মাইনিউজ স্টুডেন্ট ::* ছাত্র ফলাফল ফাঙ্ক ) ( ) ;

MyNewStudent myStd_obj ;

ছাত্র ফলাফল ফাঙ্ক = এবং মাইনিউজ স্টুডেন্ট :: ছাত্রপাস ;

( myStd_obj. * ছাত্র ফলাফল ফাঙ্ক ) ( ) ;

ছাত্র ফলাফল ফাঙ্ক = এবং মাইনিউজ স্টুডেন্ট :: ছাত্র ফেল ;

( myStd_obj. * ছাত্র ফলাফল ফাঙ্ক ) ( ) ;

ফিরে 0 ;

}

আউটপুট:

আমরা আমাদের কোডে সদস্য ফাংশন এবং তারপর সদস্য ফাংশন পয়েন্টার তৈরি করেছি। এর পরে, আমরা সদস্য ফাংশন কল এবং ফলাফল এখানে প্রদর্শন.

উদাহরণ 5:

এই উদাহরণে 'SampleClass' তৈরি করা হয়েছে। তারপর, মেম্বার ফাংশন পয়েন্টারটি এখানে স্থাপন করা হয়েছে যা হল “(SampleClass::*MyFunc)()”। এর নিচে, আমরা ফাংশন পয়েন্টার তৈরি করি যা হল “(*MyFuncPtr)()”। এর নীচে, আমরা 'স্ট্রিং' ভেরিয়েবলের 'নাম' এবং সেইসাথে 'MyFunc f' সদস্য ফাংশন পয়েন্টার ঘোষণা করি।

এর পরে, আমাদের কাছে 'পাবলিক' কনস্ট্রাক্টর রয়েছে যেখানে আমরা এই সদস্য ফাংশন ভেরিয়েবলটিকে সংজ্ঞায়িত করি। এর নীচে, আমরা 'myFunc_1()' এবং 'myFunc_1()' নামে সদস্য ফাংশন তৈরি করি এবং প্রতিটি সদস্য ফাংশনে 'cout' যোগ করি যা আমরা যখন এই সদস্য ফাংশনটিকে কল করি তখন প্রদর্শিত হবে।

তারপর, আমরা '(this->*f)()' এর সাহায্যে এই সদস্য ফাংশন পয়েন্টারকে কল করি। তারপর, আমরা আবার ফাংশন স্থাপন. এখানে, আমরা 'cout' বিবৃতি পরিবর্তন করি যা আমরা পূর্বে যোগ করেছি। তারপর, 'main()' এখন চালু করা হয়েছে এবং সদস্য ফাংশন পয়েন্টারটিকে 'MyFunc f = &SampleClass::myFunc_2' হিসাবে সংজ্ঞায়িত করা হয়েছে।

তারপর, ফাংশন পয়েন্টারটিকে 'MyFuncPtr fp = myFunc_1' হিসাবেও সংজ্ঞায়িত করা হয়েছে৷ এর পরে, আমরা মেম্বার ফাংশন পয়েন্টার ব্যবহার করতে '(a.*f)()' টাইপ করি। সদস্য ফাংশন ব্যবহার করার জন্য 'b.func' স্থাপন করা হয়েছে। তারপর, আমরা ফাংশন পয়েন্টার কল করার জন্য 'fp()' রাখি।

কোড 5:

# অন্তর্ভুক্ত করুন

নামস্থান std ব্যবহার করে ;

ক্লাস নমুনা ক্লাস ;

typedef অকার্যকর ( নমুনা ক্লাস ::* মাইফাঙ্ক ) ( ) ;

typedef অকার্যকর ( * MyFuncPtr ) ( ) ;

ক্লাস নমুনা ক্লাস {

স্ট্রিং নাম ;

MyFunc চ ;

সর্বজনীন :

নমুনা ক্লাস ( const চর * নাম )

: নাম ( নাম ) ,

( এবং নমুনা ক্লাস :: myFunc_1 )

{ }

অকার্যকর myFunc_1 ( ) { cout << নাম << 'আমরা এখানে fuction 1 বলেছি' << endl ; }

অকার্যকর myFunc_2 ( ) { cout << নাম << 'আমরা এখানে ফাংশন 2 কল করেছি' << endl ; }

অকার্যকর ফাংশন ( ) {

( এই ->* ) ( ) ;

}

} ;

অকার্যকর myFunc_1 ( ) { cout << 'প্রথম ফাংশন' << endl ; }

অকার্যকর myFunc_2 ( ) { cout << 'দ্বিতীয় ফাংশন' << endl ; }

int প্রধান ( )

{

MyFunc চ = এবং নমুনা ক্লাস :: myFunc_2 ;

MyFuncPtr fp = myFunc_1 ;

নমুনা শ্রেণী ক ( 'প্রথম -' ) , ( 'দ্বিতীয় -' ) ;

( * ) ( ) ;

খ. ফাংশন ( ) ;

fp ( ) ;

}

আউটপুট:

কোডের ফলাফল এখন এখানে রেন্ডার করা হয়েছে যা আমাদের কোডের ফাংশনগুলিকে বলে সেই অনুযায়ী ফলাফল রেন্ডার করে।

উপসংহার

আমরা অন্বেষণ করেছি যে C++-এ 'সদস্য ফাংশন পয়েন্টারগুলি' গতিশীল বাঁধাই, আচরণের এনক্যাপসুলেশন, এবং OOP-এর প্রেক্ষাপটে ফাংশন আহ্বানের নমনীয় হ্যান্ডলিং সহজ করে। আমরা শিখেছি যে 'সদস্য ফাংশন পয়েন্টার' এর ব্যবহার C++ কোডবেসের মডুলারিটি এবং নমনীয়তাকে উল্লেখযোগ্যভাবে উন্নত করতে পারে, যা অসংখ্য ডিজাইন এবং রানটাইম চ্যালেঞ্জ মোকাবেলার জন্য একটি শক্তিশালী টুল প্রদান করে।