সাধারণত একটি ক্লাসের প্রোটেক্টেড এবং প্রাইভেট মেম্বারগুলোকে সরাসরি এক্সেস করা যায় না। আরেকটি পাবলিক ফাংশন ক্লাসের মধ্যে ডিফাইন করে আমরা এ কাজটি করতে পারি। এছাড়াও আমরা এই কাজটি আরও এক ভাবে করতে পারি – ফ্রেন্ড ফাংশনের সাহায্যে। এই ফাংশনের মাধ্যমে প্রোটেক্টেড এবং প্রাইভেট মেম্বারগুলো এক্সেস করা যাবে, যদি friend কী-ওয়ার্ডটা দিয়ে এটি ক্লাসের মধ্যে ডিক্লেয়ার করে দেওয়া হয়। খেয়াল কর, এই ফ্রেন্ড ফাংশন কিন্তু ক্লাসের মেম্বার না

তবে শুধু ফাংশনই ফ্রেন্ড হবে, এমন কোনো কথা নেই। ফ্রেন্ড হতে পারে টেমপ্লেট, ক্লাসের মেম্বার কিংবা পুরো একটি ক্লাসই! আমরা প্রথমেই ফ্রেন্ড ফাংশন আলোচনা করবো।

যেভাবে ক্লাসের ভেতরে ফ্রেন্ড ফাংশনটি ডিক্লেয়ার করবো

কাজটা খুবই সহজ। ফাংশন ডিক্লারেশনের সাধারণ ফরম্যাটের আগে শুধু “friend” কী-ওয়ার্ডটা লাগিয়ে দিতে হবে। যেমন, নিচের কোডটি দেখঃ

class box {
    int width;
    public:
        int height;
        void set_width (int a);
        friend int get_width (); // eta ekta friend function
}

ব্যস, হয়ে গেল! এবার আমরা পুরো কোডটি দেখি। আমরা আগের মতই width অ্যাসাইন করবো করবো। তবে সেটা প্রিন্ট করবো একটি friend function দিয়ে!

#include <iostream>
using namespace std;
class box {
    int width;
    public:
        int height;
        void set_width (int a);
        friend int get_width (); // eta ekta friend function
} box1;

void box::set_width(int a) {
    width = a;
}
int get_width() {
    return box1.width;
}

int main() {
    box1.set_width(7);
    cout << get_width();
    return 0;
}

friend ক্লাস

এবার ধরা যাক, আমাদের কাছে দু’টি ক্লাস আছে – classOne এবং classTwo। আমরা যদি classTwo-এর সকল মেম্বারকে classOne-এর friend বানাতে চাই (অর্থাৎ classOne ক্লাসটা classTwo-এর সকল মেম্বার এক্সেস করতে পারবে), তাহলে classOne-এর ডেফিনিশনে লিখতে হবেঃ

friend class classTwo;

বেশি কথা বাড়াচ্ছি না। কোড দেখলেই ব্যাপারটা বুঝতে পারবে!

#include <iostream>
using namespace std;
class Box {
    int height, width, length;
    public:
        int set_height (int a) {
            height = a;
        }
        int set_width (int a) {
            width = a;
        }
        int set_length (int a) {
            length = a;
        }
};

int main() {
    Box box1;
    int in;
    cout << "Height please: ";
    cin >> in;
    box1.set_height(in);
    cout << "Length please: ";
    cin >> in;
    box1.set_length(in);
    cout << "Width please: ";
    cin >> in;
    box1.set_width(in);
    return 0;
}

এই কোডটা যা করে তা হল length, width, height-এর ইনপুট গ্রহণ করে। এখন আমরা চাই, আরেকটি ক্লাসের সাহায্যে এর আয়তন বের করতে। এখন আয়তন বের করার জন্য এর length, width, height-এর প্রতি আমাদের এক্সেস লাগবে, যেগুলো প্রাইভেট মেম্বার। কিন্তু আমরা পুরনো ক্লাসে নতুন কোনো ফাংশন ডিফাইন করতে পারবো না।

এ সমস্যা সমাধানের জন্যই আমরা সাহায্য নিব friend-এর। এজন্য আমাদের পুরনো ক্লাসে আমরা শুরুতেই লিখে ফেলবোঃ

class Box {
    friend class calc_volume; // eta kheyal koro
    int height, width, length;
    public:
        int set_height (int a) {
            height = a;
        }
        int set_width (int a) {
            width = a;
        }
        int set_length (int a) {
            length = a;
        }
};
class calc_volume {
};

এখন calc_volume ক্লাসটা Box ক্লাসের প্রাইভেট মেম্বার height, width, length এক্সেস করতে পারবে। তাহলে আমরা এবার আয়তন বের করার ফাংশনটা লিখে ফেলি!

class calc_volume {
    public:
        int volume;
        int calc (Box a) {
            volume = a.length*a.height*a.width;
        }
};

খেয়াল কর, আমরা এই ফাংশনে প্যারামিটার হিসেবে একটা অবজেক্ট পাঠাচ্ছি। যে অবজেক্টের আয়তন তুমি বের করতে চাও, মেইন ফাংশনে সে অবজেক্টটাকেই এ ফাংশনের প্যারামিটার হিসেবে পাঠাতে হবে! পুরো কোডটি দেখ, তাহলেই বুঝতে পারবে!

#include <iostream>
using namespace std;
class Box {
    friend class calc_volume;
    int height, width, length;
    public:
        int set_height (int a) {
            height = a;
        }
        int set_width (int a) {
            width = a;
        }
        int set_length (int a) {
            length = a;
        }
};
class calc_volume {
    public:
        int volume;
        int calc (Box a) {
            volume = a.length*a.height*a.width;
        }
};
int main() {
    Box box1;
    calc_volume boxx;
    int in;
    cout << "Height please: ";
    cin >> in;
    box1.set_height(in);
    cout << "Length please: ";
    cin >> in;
    box1.set_length(in);
    cout << "Width please: ";
    cin >> in;
    box1.set_width(in);
    boxx.calc(box1);
    cout << endl << "Volume = " << boxx.volume << endl;
    return 0;
}

আজ এ পর্যন্তই। আমরা আগামী পর্বে এই কাজগুলো ভিন্ন একভাবে করতে শিখবো, নাম তার ইনহ্যারিটেন্স!

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed