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

ক্লাস ডিক্লারেশন

ক্লাস ডিফাইন করার মাধ্যমে আমরা অবজেক্ট তৈরির ব্লু-প্রিন্ট ডিফাইন করি। এরপর এই ব্লুপ্রিন্ট ব্যবহার করে আমরা বিভিন্ন অবজেক্ট তৈরি  করতে পারি। সহজ কথায় ক্লাস হল নতুন একটা টাইপ। ব্যাপারটাকে তুমি ভ্যারিয়েবলের সাথে তুলনা করতে পার। int-কে তুলনা করতে পার একটা ক্লাসের সাথে। আর int a,b; লিখে তুমি একেকটা integer টাইপের ভ্যারিয়েবল তৈরি কর, এগুলো তুলনীয় একেকটি অবজেক্টের সাথে।

ক্লাস ডিফাইন করার জন্য আমরা class কী-ওয়ার্ডটি ব্যবহার করবো। সাথে আমাদের বলতে হবে ক্লাসটির নাম। এরপর সেকেন্ড ব্র্যাকেটের মধ্যে বলে দিতে হবে ক্লাসটির মেম্বারগুলোর কথা। তাহলে ক্লাসের ডিক্লারেশন দাঁড়াচ্ছে নিচের মতঃ

class box {
    public:
        int height;
        int width;
        int length;
} ;

এখানে আমাদের ক্লাসটির নাম হল box এবং height, width, length-এই তিনটি হল ক্লাসটির মেম্বার। খেয়াল করে দেখ ডাটা স্ট্রাকচারের সাথে এর মূল পার্থক্য হল public কী-ওয়ার্ডটায়। public দ্বারা বুঝাচ্ছে এই ক্লাসটা আমরা যে স্কোপ (স্কোপ আছে দুই ধরণের – লোকাল এবং গ্লোবাল)-এ ডিক্লেয়ার করছি, সে স্কোপের সকল কিছু দ্বারা এই public কী-ওয়ার্ড-এর নিচে লেখা মেম্বারগুলো এক্সেস করা সম্ভব। এটাকে বলা হয় এক্সেস স্পেসিফায়ার (Access Specifier)। আরও দুটি এক্সেস স্পেসিফায়ার রয়েছে : protected এবং private।

  • private : একটি ক্লাসের প্রাইভেট মেম্বারগুলোকে শুধুমাত্র সে ক্লাসটির অন্যান্য মেম্বার এবং ক্লাসটির friend থেকে এক্সেস করতে পারবে।
  • protected : একটি ক্লাসের প্রোটেক্টেড মেম্বারগুলোকে সে ক্লাসের অন্যান্য মেম্বার, friend ছাড়াও এর derived class-এর মেম্বারগুলো এক্সেস করতে পারবে।
  • public : পাবলিক মানে তো বুঝোই। সে ক্লাসটা যে স্কোপে আছে, সে স্কোপের সবকিছুই এর মেম্বারগুলোকে এক্সেস করতে পারবে।

/* Derived Class এবং Friend কী-সেটা আমরা পরের পর্বগুলোতে জানবো। */

আর আমরা যদি কোনো স্পেসিফায়ার না দি, তাহলে কম্পাইলার ধরে নিবে মেম্বারগুলো প্রাইভেট। যেমন নিচের কোডে তিনটি মেম্বারই প্রাইভেটঃ

class box {
        int height;
        int width;
        int length;
} ;

আবার নিচের কোডে  a প্রাইভেট, b প্রোটেক্টেড এবং c পাবলিক।

class box {
    int a;
    protected:
        int b;
    public:
        int c;
}

ক্লাস দিয়ে অবজেক্ট বানানো

আগেই বলেছি, ক্লাস হল অবজেক্ট তৈরির ব্লু-প্রিন্ট। এবার আমরা দেখবো কীভাবে ক্লাস ব্যবহার করে একটি অবজেক্ট বানানো যায়। এটা কয়েকভাবে করা যায়। প্রথমত, আমরা করতে পারি এভাবেঃ

#include <iostream>
class box {
    int a;
    protected:
        int b;
    public:
        int c;
} ;
int main() {
    box box1;
    box box2;
}

আবার কমা দিয়ে একাধিক অবজেক্টের নাম আলাদা করে দিলেও হয়ে যায়। যেমনঃ

box box1, box2, box3;

আবার আমরা ক্লাস ডিক্লেয়ার করার সময়ই অবজেক্ট ক্রিয়েট করে ফেলতে পারি। যেমনঃ

#include <iostream>
class box {
    int a;
    protected:
        int b;
    public:
        int c;
} box1;
int main() {
    
    box box2;
}

এই কোডে box1 আছে গ্লোবাল স্কোপে, আর box2 আছে লোকাল স্কোপে।

এছাড়াও আমরা ক্লাসের নাম না দিয়ে শুধু অবজেক্ট ক্রিয়েট করলেই পারি (ডাটা স্ট্রাকচারের মতই)। যেমনঃ

#include <iostream>
class {
    int a;
    protected:
        int b;
    public:
        int c;
} box1;
int main() {
    // box box2;
}

এক্ষেত্রে সমস্যা হল আমরা পরবর্তীতে এই ক্লাসকে ব্লু-প্রিন্ট হিসেবে ব্যবহার করে নতুন কোনো অবজেক্ট তৈরি করা যাবে না!

মেম্বার এক্সেস করবো যেভাবে

একটি ক্লাসের পাবলিক মেম্বারগুলো এক্সেস করা খুবই সহজ। আমরা ডাটা স্ট্রাকচারের মতই ডট অপারেটর (.) ইউজ করে এই কাজটি করতে পারি।

#include <iostream>
using namespace std;
class box {
    int length;
    int width;
    public:
        int height;
} box1;
int main() {
    cout << box1.height << endl;
    box1.height = 7;
    cout << box1.height << endl;
}

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

তাহলে আমরা কাজ শুরু করে দি। প্রথমে আমরা একটা ফানশন নিয়ে কাজ করবো, যার কাজ হবে মেইন ফাংশন থেকে একটা মান নিয়ে সেটা length-মেম্বারটিতে অ্যাসাইন করা। তাহলে আমাদের ফাংশনটির প্যারামিটার হবে একটা ইন্টিজার এবং আমাদের ফাংশনটি থেকে কোনো কিছু রিটার্ন করার দরকার নেই। আমরা প্রথমেই একটা ফাংশন ডিক্লেয়ার করি, যার এক্সেস হবে পাবলিক।

class box {
    int length;
    int width;
    public:
        int height;
        void set_length(int a);
} box1;

এবার আমাদের ফাংশনটি ডিফাইন করতে হবে। এজন্য আমাদের নতুন একটা অপারেটরের সাথে পরিচিত হতে হবে, যার নাম স্কোপ অপারেটর (::)।

void box::set_length(int a) {
    length = a;
}

এখানে box::set_length হল class_name::function_name। আর আমরা ফাংশনের মধ্যে যে প্যারামিটারটা পাঠাচ্ছি, সেটাকে length-এর মান হিসেবে সেট করে দিচ্ছি। বুঝতে না পারলে কমেন্ট সেকশনে জানাও।

এবার আমাদের আরেকটি ফাংশন দরকার, যেটা দিয়ে আমরা length-এর মানটি রিটার্ন করতে পারব। অর্থাৎ, এটাতে কোনো প্যারামিটার লাগবে না, এবং এর রিটার্ন টাইপ হবে ইন্টিজার। কথা না বাড়িয়ে তা হলে পুরো কোডটি লিখে ফেলা যাক!

#include <iostream>
using namespace std;
class box {
    int length;
    int width;
    public:
        int height;
        void set_length(int a);
        int get_length() {
            return length;
        }
} box1;

void box::set_length(int a) {
    length = a;
}
int main() {
    box1.height = 7;
    cout << "Height = " << box1.height << endl;
    box1.set_length(8);
    cout << "Length = " << box1.get_length() << endl;
}

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

এবার তোমার কাজ হবে width-এর জন্যও এরকম দু’টি ফাংশন লিখে ফেলা – একটি স্কোপ অপারেটর ব্যবহার করে, আরেকটা স্কোপ অপারেটর ব্যবহার না করে। যদি কাজটি না পার, তাহলে তোমার উচিত হবে ঠাণ্ডা মাথায় এই পর্বটা শুরু থেকে আবার পড়া।

আমরা এবার যা করবো, তা হল length, width, height এগুলো নিজেরা সেট না করে ইউজার থেকে ইনপুট নিব। এরপর আমরা box1-এর আয়তনও বের করে ফেলবো। এখন আমাদের কোডটি হবে নিচের মতঃ

#include <iostream>
using namespace std;
class box {
    int length;
    int width;
    public:
        int height;
        void set_length(int a);
        int get_length() {
            return length;
        }
        void set_width(int a);
        int get_width() {
            return width;
        }
} box1;

void box::set_length(int a) {
    length = a;
}
void box::set_width(int a) {
    width = a;
}
int main() {
    int in, volume;
    cout << "Height Please: ";
    cin >> in;
    box1.height = in;
    cout << "Length Please: ";
    cin >> in;
    box1.set_length(in);
    cout << "Width Please: ";
    cin >> in;
    box1.set_width(in);

    cout << "Height = " << box1.height << endl;
    cout << "Length = " << box1.get_length() << endl;
    cout << "Width = " << box1.get_width() << endl;
    cout << "Volume = " << box1.height * box1.get_length() * box1.get_width() << endl;
}

এই কোড রান করে প্রয়োজনীয় ইনপুটগুলো দিলে আউটপুট আসবে নিচের মতঃ

Snap 2015-07-31 at 20.26.31

আজ এ পর্যন্তই। কিছু বুঝতে সমস্যা হলে কমেন্ট সেকশনে জানাবেন।

Muntasir Wahed

Muntasir Wahed

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