অবজেক্ট অরিয়েন্টেড সি++ এবং Access Modifiers



Public vs Private vs Protected


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

লক্ষ্য করবেন এখানে ড্রাইভার জানেন যে তার গাড়িটা ব্রেক করে স্টপ করতে হবে, কিন্তু এটা জানে না কীভাবে এই আসলেই এই গাড়িটা স্টপ হচ্ছে। অনেকেই জানে না গাড়িটার ইঞ্জিনের ভিতর কীভাবে কাজ করছে এবং কীভাবে ব্রেক প্যাডেলে চাপ দেয়ার সাথে সাথে গাড়ির ইঞ্জিনটা ঠিক কি করে গাড়িটাকে থামাচ্ছে। তো এটা হচ্ছে একটি ইঞ্জিনের ভিতরের খবর। এটাকে বলে তথ্য লুকানো অথবা DATA HIDING.

সি++ এ Access Modifiers এর কাজ হচ্ছে তথ্য লুকানো, এটা অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর সবচেয়ে গুরুত্বপূর্ণ ফিচার এবং এটাকে বলে DATA HIDING. আচ্ছা গাড়ির ইঞ্জিনের কাজটা না হয় বুঝলাম, কিন্তু সি++ এ এই Access Modifiers এর কাজটা কি?

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এ আমরা Access Modifiers ব্যবহার করে আমরা Class গুলোর ব্যবহার অথবা Accessibility সীমিত করতে পারি। Access Modifiers এর কাজই এটা শুধু। কোডে আমরা এটা ব্যবহার করে কিছু রেস্ট্রিকশন বসাতে পারি, যাতে আমাদের তথ্য গুলো নিরাপদ থাকে এবং নির্দিষ্ট ফাংশনের বাইরে এবং কোডের বাইরে অর্থাৎ বাইরের বিশ্বে সেই তথ্য গুলো প্রকাশ না পায়। 

৩ ধরনের Access Modifiers আছে সি++ ল্যাংগুয়েজে। সেগুলো হচ্ছে — 

  1. Public
  2. Private
  3. Protected

নোটঃ সি++ এ Class এর ভিতর মেম্বার দের যদি কোনো প্রকারের Access Modifiers ডিফাইন করা না হয়, তাহলে ডিফল্ট ভাবে সেই মেম্বার গুলো Private হয়ে যাবে।


১. পাবলিক (Public) — 

ধরেন অক্সিজেন। এইটাতে কেও আপনাকে বাধা দিতে পারবে না, আপনার আমার যখন লাগবে তখনই ব্যবহার করতে পারতেছি যেকোনো জায়গা থেকে। তো এই অক্সিজেন হচ্ছে Public Modifier। Public এর আন্ডারে যেসকল ডেটা মেম্বারদের ডিক্লায়ার করা হবে সেগুলো কোডের ভিতর যেকোনো ফাংশন ব্যবহার এবং কল করতে পারবে। সেই ডেটা গুলোকে আবার বাইরের Class গুলোও ব্যবহার করতে পারবে। পাবলিক ক্লাশের সাথে শুধুমাত্র (.) ডট অপারেটর ব্যবহার করে সরাসরিভাবে ক্লাশের ভিতরের ডেটা মেম্বারদের এক্সেস করা যাবে। নিচের কোডটি দেখলে বুঝতে পারবেন ভালো করে — 

// c++ oop public access modifier

#include <iostream>

using namespace std;

// defining a class
class Circle {
    public:                     // we defined that this class data members will be public
        double radius;
        double compute_area(){
            return 3.14*radius*radius;
        }
};                              // always put semicolons after defining a class

//main function
int main(){
    Circle ball;
    
    ball.radius = 3.5;            // accessed public data number outside Circle class
    
    cout << "Radius is: " << ball.radius << endl;
    cout << "Area is: " << ball.compute_area();
    
    return 0;
}

আউটপুট হবে — 

Radius is: 3.5 
Area is: 38.465

উপরের প্রোগ্রামটিতে ডেটা মেম্বার Radius পাবলিক ছিলো তাই মেইন ফাংশন থেকে ball নামক অবজেক্টটি ক্লাশের বাইরে একে এক্সেস করতে পারছে।


২. প্রাইভেট (Private) — 

এবার চলেন একটু আমাদের ঘর থেকে ঘুরে আসি। নাহ খাইতে না। কথা বলবো আমাদের বাসার আলো নিয়ে। অন্ধকারে আমরা বাসায় আলো জালাই। এখন এই আলোটা শুধু বাড়ির ভিতরের মানুষজনই কিন্তু ব্যবহার করতে পারবে। মাঝেমধ্যে দরকার পড়লে আমাদের পাশের বাসার লোকজনই ব্যবহার করতে পারবে কিন্তু দরকার হলে শুধু। তাছাড়া বাড়ির বাইরের কেও এই আলো ব্যবহার করতে পারবে না।

এখন ধরে নেন, এই বাড়িটা হচ্ছে সি++ এর একটি ফাংশন এবং আলোটা হচ্ছে এখানে ডেটা মেম্বার এবং আমাদের পাশের বাসাটা হচ্ছে বন্ধু ফাংশন অথবা Friend Function। চলেন নিচের কোডটা একবার দেখে নেই — 

// c++ oop private access modifier

#include <iostream>

using namespace std;

// defining a class
class Circle {
    private:                     // we defined that this class data members will be private
        double radius;
    
    public:                     // and we kept the member function public
        double compute_area(){          
            return 3.14*radius*radius;      // member function can access private data member radius
        }
};                              // always put semicolons after defining a class

//main function
int main(){
    Circle ball;                // create a object called ball
    
    ball.radius = 3.5;          // trying to access private data member radius directly from outside the class (It's PROHIBETED)
    
    cout << "Radius is: " << ball.radius << endl;
    cout << "Area is: " << ball.compute_area();
    
    return 0;
}

উপরের কোডটি কম্পাইল করলে আমাদেরকে Error দেখাবে। কারন আমরা প্রাইভেট ডেটা মেম্বার গুলোকে তাদের ক্লাশের বাইরে সরাসরি এক্সেস করতে পারবো না।

আউটপুট হবে — 

 In function 'int main()': 
10:16: error: 'double Circle::radius' is private
22:10: error: within this context
10:16: error: 'double Circle::radius' is private
24:35: error: within this context

আমরা এটাকে ঠিক করতে পারবো প্রাইভেট ডেটা মেম্বারের ক্লাশে থাকা পাবলিক ফাংশনটিকে ব্যবহার করে। সেটার জন্য কী করতে হবে তা নিচের কোডে দেখতে পারবেন — 

// c++ oop private access modifier

#include <iostream>

using namespace std;

// defining a class
class Circle {
    private:                     // we defined that this class data members will be private
        double radius;
    
    public:                     // and we kept the member function public
        double compute_area(double r){    
            radius = r;         // member function can access private data member radius
            
            double area = 3.14*radius*radius;
            
            cout << "Radius is: " << radius << endl;
            cout << "Area is: " << area;
        }
};                              // always put semicolons after defining a class

//main function
int main(){
    Circle ball;                // create a object called ball
    
    ball.compute_area(3.5);     // trying to access private data member radius directly from outside the class

    return 0;
}

আউটপুট হবে — 

Radius is: 3.5 
Area is: 38.465

৩. প্রোটেকটেড (Protected) — 

প্রোটেকটেড Access Modifier অনেকটাই প্রাইভেটের মতোন, শুধু পার্থক্যটা হচ্ছে Class এর ভিতরে প্রোটেকটেড ডিক্ল্যায়ার করা ডেটা মেম্বার গুলোকে Class এর বাইরে থেকে কল করা যায় না ঠিকই কিন্তু অই Class এর ভিতরে থাকা অন্যান্য Sub Class(derived class) রা এক্সেস করতে পারবে। এইখানে Class এবং derived class এর সম্পর্কটাকে Parent-Child সম্পর্ক বলা হয়। চলুন একটা প্রোগ্রাম দেখে নেই, তাহলে ভালভাবে বুঝা যাবে — 

// c++ oop protected access modifier

#include <iostream>

using namespace std;

// defining a class
class Parent {
    protected:                     // we defined that this class data members will be protected
        int number_protected;
};

// defining a sub class or derived class
class Child : public Parent {
    public:                     // and we kept the member function public
        void setNumber(int number) {
            number_protected = number;  // Child class can access the inherited protected data members of Parent Class
        }
        
        void displayID() {
            cout << "Protected Number is: " << number_protected << endl;
        }
};

//main function
int main(){
    Child obj1;                // create a child object
    
    obj1.setNumber(2);          // member function of derived class can access the protected data members of base class
    obj1.displayID();

    return 0;
}

আউটপুট হবে — 

Protected Number is: 2

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং নিয়ে আমার আগের লিখা গুলো পড়তে পারবেন আমার ব্যক্তিগত ব্লগ এবং মিডিয়াম থেকে —

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং সি++
আমাদের আশেপাশে কতই তো মানুষ দেখি, প্রতিটি মানুষই একজন আরেকজন থেকে আলাদা, আবার সবার কিছু একই রকম বৈশিষ্ট থাকে। থাক বাদ…bit.ly

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং সি++
মাত্র ৪ মিনিটে ব্যাসিক সি++ অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং কনসেপ্ট এবং ফান্ডামেন্টালসmedium.com

অবজেক্ট অরিয়েন্টেড সি++ (Class এবং Class Members)
সি++ প্রোগ্রামিং এর আসল উদ্দেশ্য হচ্ছে সি প্রোগ্রমিং এর মধ্যে অবজেক্ট অরিয়েন্টেশন যুক্ত করা এবং সি++ এর class গুলো…bit.ly

অবজেক্ট অরিয়েন্টেড সি++ (Class এবং Class Members)
এই লিখাটি পূর্বে আমার ব্যাক্তিগত ব্লগে পাব্লিশ হয়েছে। পড়তে পারবেন এখান থেকে —medium.com

আজকে এই পর্যন্তই। ধন্যবাদ সাথে থাকার জন্য।

#হ্যাপি_প্রোগ্রামিং


আমার ব্যাক্তিগত ব্লগ — 

বাংলা ভার্শন — https://with.dibakar.me/

ইংলিশ ভার্শন — https://with.dibakar.me/en/

আমাকে পাবেন — 

ফেসবুকে — https://www.facebook.com/dipu.dibakar

মিডিয়ামে — https://medium.com/@iamdibakardipu

টুইটারে — https://twitter.com/iamdibakardipu

ইনস্টাগ্রামে — https://www.instagram.com/dibakardipu/

গিটহাবে — https://github.com/dibakarsutradhar

লিঙ্কড ইনে — https://linkedin.com/in/dibakardipu/

Posts created 18

মন্তব্য করুন

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

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top
Scroll Up