Operator Overloading | Friend Operator Function | পর্ব ৩

Friend operator function শুরু করার আগে আমি আশা করব আপনি Operator Overloading এর বেসিক কনসেপ্ট জানেন, আর যদি আরেকবার বেসিকটা রিক্যাপ করতে চান তাহলে ১ম পর্ব ( Operator Overloading | বেসিক ধারণা  ) পড়ুন।

Friend operator function এর বিস্তারিত বলার আগে একটা কথা বলে নিই, বেশিরভাগ ক্ষেত্রেই আপনি অপারেটর ওভারলোডিং এ friend function ব্যবহার করছেন নাকি member function ব্যবহার করছেন তার উপর কোন ফাংশনাল পরিবর্তন আসে না। এই সব ক্ষেত্রে মেম্বার ফাংশান ব্যবহার করাই শ্রেয়। কিন্তু একটি ক্ষেত্রে আপনাকে friend operator function ব্যবহার করতেই হবে। এই পর্বে সেটিই দেখব।

Operator Overloading | বেসিক ধারণা এই পর্বে দেখেছেন আমরা Box ক্লাস এর দুইটা অবজেক্ট এর দৈর্ঘ, প্রস্থ ও উচ্চতা যোগ করার জন্য প্লাস(+) অপারেটর ওভারলোড করেছি। স্টেটমেন্ট টা ছিল অনেকটা এমন

b2 = b1 + b2;

এখানে b1, b2 Box ক্লাস এর অবজেক্ট। প্লাস(+) এর লেফট অপারেন্ড (এখানে b1) অবজেক্ট টি Operator+(Box b2) ফাংশান কল জেনারেট করে এবং this পয়েন্টার এর মাধ্যমে implicitly পাস হয়।

এই পর্যন্ত বোঝাটা খুবই জরুরী। এই পর্যন্ত বুঝলে আপনি বাকিটুকু খুবই সহজে বুঝবেন। এখন আমি যদি নিচের স্টেটমেন্ট টা লিখি তাহলে কি কোন প্রব্লেম আছে?

b2 = b1 + 100;

আসলে উপরের কোডটি সম্পূর্ণরূপে বৈধ। আপনাকে জাস্ট আর একটি operator+() ওভারলোড করার ফাংশান লিখতে হবে যার আর্গুমেন্ট হবে একটা ইন্টেজার। নিচে কোডটি দেখুন

এখন সম্পূর্ণকোডটি লিখে একবার রান করে দেখুন সব ঠিক আছে কিনা।

সব ঠিক থাকলে ভাবছেন, friend operator function ব্যবহার ই তো করলাম না। ধুর ছাই! সময় নষ্ট ভেবে এখন যারা একটু বিরক্ত বোধ করছেন তাদের বলছি, এখান থেকেই শুরু আজকের মূল টপিক।

আপনেকে যদি বলি স্টেটমেন্ট টা আমি এই ভাবে লিখতে চাই

b2 = 100 + b1; এখানে শুধু অর্ডারটা বদলে প্রথমে ইন্টিজার দিয়েছি।

এখনকি আগের ফাংশান কাজ করবে। উত্তরটা হল, না করবে না। কারনটা একটু বুদ্ধি খাটালেই বুঝতে পারার কথা।

আমরা জানি লেফট অপারেন্ডটি ফাংশান কল জেনারেট করে। এখানে লেফট অপারেন্ড হল ১০০, যেটা কিনা একটি ইন্টিজার, অর্থাৎ বিল্ট ইন টাইপ। তার মানে এটা Box এর কোন মেম্বার না, আর তাই মেম্বার ফাংশান এর সাথে এর কোন সম্পর্কও নেই। তাই এরর দেখাবে no match for operator+

এই ক্ষেত্রে অপারেটরকে গ্লোবালি ওভারলোড করতে হবে। তারমানে এখন আর এটি একটা ক্লাস এর মেম্বার ফাংশান না। যেহুতু মেম্বার ফাংশান না, তাই অপারেন্ডও implicitly this পয়েন্টার দিয়ে পাস হবে না। তাই দুইটা অপারেন্ড ই আর্গুমেন্ট হিসেবে পাস করতে হবে। এখন ফাংশানটির চেহারা হবে এমন।

খেয়াল করে দেখুন এখানে Box::operator+ লেখা হয় নি। কারন এটি আর এখন মেম্বার ফাংশান না। কিন্তু মেম্বার ফাংশান যেহেতু না, তাহলে ভাবছেন ক্লাস এর private প্রোপার্টি(length, width, height) এক্সেস করবে কিভাবে!

দুইটা উপায় আছে এক্সেস করার। প্রথম উপায় হল private প্রোপার্টি(length, width, height) গুলোকে public করে দেওয়া। এভাবে কাজ করবে কিন্তু বুদ্ধিটা জঘন্য।

দ্বিতীয় উপায় হল friend function.  এই operator+(int n, Box b) ফাংশানকে Box ক্লাস এর মধ্যে ফ্রেন্ড হিসেবে ডিক্লিয়ার করা। ফলে Box ক্লাস এর প্রাইভেট প্রোপারটি এক্সেস করতে পারবে।

তাহলে এবার আপনি নিজে একবার পুরো কোডটি লেখার চেষ্টা করে দেখুন। তারপর আমার কোড এর সাথে মিলিয়ে নিন।

 

অপারেটর ওভারলোডিং এর উপর সকল পোস্ট পেতে ক্লিক করুন।

Print Friendly

মন্তব্য করুন

আপনার ই-মেইল এ্যাড্রেস প্রকাশিত হবে না। * চিহ্নিত বিষয়গুলো আবশ্যক।