c++ - উনল - সি++ বই




কেন সি++ এ নেস্টেড ক্লাস ব্যবহার করবেন? (3)

Nested ক্লাস বাস্তবায়ন গোপন লুকানোর জন্য শীতল।

তালিকা:

class List
{
    public:
        List(): head(nullptr), tail(nullptr) {}
    private:
        class Node
        {
              public:
                  int   data;
                  Node* next;
                  Node* prev;
        };
    private:
        Node*     head;
        Node*     tail;
};

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

std::list বা std::map তারা সব লুকানো ক্লাস রয়েছে (অথবা তারা কি?) দেখুন। বিন্দুটি তারা হতে পারে বা নাও হতে পারে, তবে বাস্তবায়নটি ব্যক্তিগত এবং গোপন থাকা সত্ত্বেও STL এর নির্মাতা কোডটি কীভাবে ব্যবহার করেছিলেন তা প্রভাবিত করে কোডটি আপডেট করতে সক্ষম হয়েছিল, বা STL- এর কাছাকাছি পুরানো লাগেজের বিছানা ছেড়ে দেওয়ার কারণে তাদের প্রয়োজন ছিল কিছু বোকা যাদের পিছনে লুকানো ছিল নোড ক্লাস ব্যবহার করতে চেয়েছিলেন তারা সঙ্গে পিছনে সামঞ্জস্য বজায় রাখা।

কেউ অনুভুতি ক্লাস এবং বুঝতে ব্যবহার করার জন্য কিছু চমৎকার সম্পদ দিকে আমাকে নির্দেশ করতে পারেন? আমার কিছু আইএমবি জ্ঞান কেন্দ্র - নেস্টেড ক্লাসের মত প্রোগ্রামিং উপকরণ এবং কিছু জিনিস রয়েছে

কিন্তু আমি এখনও তাদের উদ্দেশ্য বুঝতে অসুবিধা হচ্ছে। কেউ আমাকে সাহায্য করতে পারে?


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

উদাহরণস্বরূপ, একটি জেনেরিক Field ক্লাস বিবেচনা করুন যার একটি আইডি নম্বর, একটি টাইপ কোড এবং একটি ক্ষেত্রের নাম রয়েছে। যদি আমি এই Field vector আইডি নম্বর বা নাম দ্বারা অনুসন্ধান করতে চাই তবে আমি এটি করতে একটি ফ্যান্টর্ট তৈরি করতে পারি:

class Field
{
public:
  unsigned id_;
  string name_;
  unsigned type_;

  class match : public std::unary_function<bool, Field>
  {
  public:
    match(const string& name) : name_(name), has_name_(true) {};
    match(unsigned id) : id_(id), has_id_(true) {};
    bool operator()(const Field& rhs) const
    {
      bool ret = true;
      if( ret && has_id_ ) ret = id_ == rhs.id_;
      if( ret && has_name_ ) ret = name_ == rhs.name_;
      return ret;
    };
    private:
      unsigned id_;
      bool has_id_;
      string name_;
      bool has_name_;
  };
};

তারপরে এই Field জন্য অনুসন্ধান করার জন্য কোডটি Field ক্লাসের মধ্যেই স্কোপ করা match ব্যবহার করতে পারে:

vector<Field>::const_iterator it = find_if(fields.begin(), fields.end(), Field::match("FieldName"));

এক নিস্তেজ শ্রেণীর সঙ্গে একটি বিল্ডার প্যাটার্ন বাস্তবায়ন করতে পারেন । বিশেষ করে সি ++, ব্যক্তিগতভাবে আমি এটি semantically পরিষ্কার খুঁজে। উদাহরণ স্বরূপ:

class Product{
    public:
        class Builder;
}
class Product::Builder {
    // Builder Implementation
}

বরং:

class Product {}
class ProductBuilder {}




inner-classes