আমরা হেডারে ব্যক্তিগত সদস্যের কার্যগুলি কেন রাখি?


16

আমরা কেন সি ++ হেডারে ব্যক্তিগত সদস্যের ভেরিয়েবলগুলি রেখেছি তার উত্তর হ'ল শ্রেণীর আকারটি এমন পয়েন্টগুলিতে অবশ্যই জানতে হবে যেখানে উদাহরণগুলি ঘোষিত হয় যাতে সংকলকটি কোডটি উত্পন্ন করতে পারে যা স্ট্যাকটি সম্পর্কে যথাযথভাবে সরে যায়।

আমাদের ব্যক্তিগত সদস্যদের হেডারগুলিতে রাখার দরকার কী?

ক্লাস সংজ্ঞায় ব্যক্তিগত কার্যাবলী ঘোষণার কোনও কারণ আছে কি?

বিকল্পটি মূলত পিম্পল আইডিয়ম তবে অতিমাত্রায় ইন্ডায়ারেশন ছাড়াই হবে।

এই ভাষার বৈশিষ্ট্যটি কি কোনও historicalতিহাসিক ত্রুটিযুক্ত?

উত্তর:


11

ব্যক্তিগত সদস্য ফাংশনগুলি হতে পারে virtualএবং সি ++ এর সাধারণ প্রয়োগে (যেটি একটি ভ্যাটেবল ব্যবহার করে) শ্রেণীর সমস্ত ক্লায়েন্টদের দ্বারা নির্দিষ্ট ক্রম এবং ভার্চুয়াল ফাংশনগুলির সংখ্যা জানা প্রয়োজন। এক বা একাধিক ভার্চুয়াল সদস্য ফাংশন থাকলেও এটি প্রযোজ্য private

মনে হতে পারে এটি "ঘোড়ার আগে কার্ট লাগানোর" মতো, কারণ সংকলক প্রয়োগকরণের পছন্দগুলি ভাষা নির্দিষ্টকরণকে প্রভাবিত করে না। তবে, বাস্তবে সি ++ ভাষা নিজেই একই সাথে ওয়ার্কিং ইমপ্লিমেন্ট ( সিফ্রন্ট ) হিসাবে বিকশিত হয়েছিল , যা ভিটিবেলগুলি ব্যবহার করে।


4
"প্রয়োগের পছন্দগুলি ভাষায় প্রভাব ফেলবে না" সি ++ মন্ত্রের প্রায় সম্পূর্ণ বিপরীত। স্পেসিফিকেশনটি কোনও নির্দিষ্ট প্রয়োগ বাস্তবায়নের বাধ্যতামূলক করে না, তবে বিশেষভাবে কার্যকর প্রয়োগের পছন্দটি প্রয়োজনীয়তার জন্য পরিপূর্ণভাবে তৈরি করা অনেকগুলি বিধি রয়েছে।
বেন ভয়েগট

এটি খুব প্রশংসনীয় শোনাচ্ছে। এটির কোনও উত্স আছে?
প্রেক্সোলিটিক

@ প্রেক্সিওলিটিক: আপনি ভার্চুয়াল পদ্ধতি সারণী সম্পর্কে পড়তে পারেন ।
গ্রেগ হিউগিল

1
@ প্রেক্সিওলিটিক - 'দ্য এনটেটেড সি ++ রেফারেন্স ম্যানুয়াল' ( স্ট্রোস্ট্রপ.com / arm.html ) - এর একটি পুরানো অনুলিপি খুঁজে পান - লেখকরা বিভিন্ন প্রয়োগের বিশদ এবং কীভাবে এটি ভাষাটির আকার নিয়েছিল সে সম্পর্কে কথা বলেন।
মাইকেল কোহেন

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

13

যদি আপনি এর সংজ্ঞা থেকে বাইরে কোনও ক্লাসে পদ্ধতিগুলি যুক্ত করার অনুমতি দিয়ে থাকেন তবে সেগুলি যে কোনও জায়গায় , যে কোনও ফাইল, যে কোনও জায়গায় যুক্ত করা যেতে পারে ।

এটি তাত্ক্ষণিকভাবে ব্যক্তিগত এবং সুরক্ষিত ডেটা সদস্যদের সমস্ত ক্লায়েন্ট কোডকে তুচ্ছ অ্যাক্সেস দেবে।

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


মনে রাখবেন আমরা সি মেমরির ++ যার মানে হচ্ছে এটা, আপনার শ্রেণী হিসেবে একই মেমরির বিন্যাস সঙ্গে একটি ছায়া টাইপ তৈরি করতে আমার নিজের মেথড যোগ (বা শুধু সমস্ত ডেটা সার্বজনিক করুন), এবং সাধারণত তুচ্ছ ব্যাপার থেকে সরাসরি প্রবেশাধিকার আছে reinterpret_cast। বা আমি আপনার ব্যক্তিগত ফাংশনের কোডটি খুঁজে পেতে পারি বা এটি আলাদা করে ফেলতে পারি। অথবা প্রতীক টেবিলের মধ্যে ফাংশনের ঠিকানাটি অনুসন্ধান করুন এবং সরাসরি কল করুন directly

এই অ্যাক্সেস স্পেসিফায়াররা এই আক্রমণগুলি প্রতিরোধ করার চেষ্টা করে না, কারণ এটি সম্ভব নয়। তারা কেবলমাত্র ক্লাসটি ব্যবহার করার কথা বলে তা নির্দেশ করে।


1
ক্লাস সংজ্ঞা ক্লায়েন্ট কোড থেকে লুকানো একটি ফাংশন ধারক সত্তা উল্লেখ করতে পারে। বিকল্পভাবে, এটি বিপরীত হতে পারে এবং ক্লায়েন্ট কোড থেকে গোপন একটি সম্পূর্ণ traditionalতিহ্যগত শ্রেণীর সংজ্ঞা একটি দৃশ্যমান ইন্টারফেসকে মনোনীত করতে পারে যা কেবলমাত্র জন সদস্যদের বর্ণনা করে এবং এর আকারটি প্রকাশ করতে পারে।
প্রেক্সোলিটিক

1
অবশ্যই, তবে সংকলন মডেলটি ক্লায়েন্ট কোডটি লুকানো ধারকটির নিজস্ব সংস্করণ বা অতিরিক্ত অ্যাক্সেসরের সাথে একটি ভিন্ন দৃশ্যমান ইন্টারফেসের ইন্টারপোজ করা বন্ধ করার কোনও যুক্তিসঙ্গত উপায় সরবরাহ করে না।
অকেজো

এটি একটি ভাল পয়েন্ট, তবে যাইহোক শিরোনামে না থাকা সমস্ত সদস্য ফাংশনগুলির সংজ্ঞাগুলির জন্য এটি সত্য নয়?
প্রেক্সিওলিটিক

1
সমস্ত সদস্য ফাংশন ক্লাসের ভিতরে যদিও ঘোষণা করা হয় । মুল বক্তব্যটি হ'ল আপনি নতুন সদস্য ফাংশন যুক্ত করতে পারবেন না যা ক্লাস সংজ্ঞায় কমপক্ষে ঘোষিত হয়নি (এবং একটি সংজ্ঞা বিধিটি একাধিক সংজ্ঞা প্রতিরোধ করে)।
বেহুদা

তাহলে ব্যক্তিগত ফাংশন নিয়মের একটি ধারক সম্পর্কে কী বলা যায়?
প্রেক্সোলিটিক

8

গৃহীত উত্তরটি ভার্চুয়াল ব্যক্তিগত ফাংশনগুলির জন্য এটি ব্যাখ্যা করে, তবে এটি কেবল প্রশ্নের একটি নির্দিষ্ট দিকটির উত্তর দেয়, যা ওপি যা বলেছিল তার চেয়ে যথেষ্ট সীমিত। সুতরাং, আমাদের পুনর্বিবেচনা করা দরকার: কেন আমাদের হেডারে নন-ভার্চুয়াল ব্যক্তিগত ফাংশনগুলি ঘোষণা করা প্রয়োজন ?

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

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

সি ++ তে, যখন শিরোনামের ফাইল শ্রেণীর সংজ্ঞাটির কোনও কিছু পরিবর্তন হয়, সেই শ্রেণীর সমস্ত ব্যবহারকারীকে অবশ্যই পুনরায় সংযুক্ত করতে হবে - এমনকি একমাত্র পরিবর্তনটি বেসরকারী শ্রেণীর সদস্যদের মধ্যেও ছিল যা শ্রেণীর ব্যবহারকারীরা এমনকি অ্যাক্সেস করতে পারে না। এটি কারণ সি ++ এর বিল্ড মডেলটি পাঠ্য অন্তর্ভুক্তির উপর ভিত্তি করে এবং সি ++ ধরে ধরেছেন যে কলাররা ব্যক্তিগত শ্রেণীর দ্বারা প্রভাবিত হতে পারে এমন একটি শ্রেণীর সম্পর্কে দুটি প্রধান বিষয় জানেন:

  • আকার এবং লেআউট : [সদস্য এবং ভার্চুয়াল ফাংশনগুলির - স্ব-বর্ণনামূলক এবং পারফরম্যান্সের জন্য দুর্দান্ত, তবে কেন আমরা এখানে নেই]
  • ফাংশন : কলিং কোডটি ক্লাসের সদস্য ফাংশনগুলিতে কলগুলি সমাধান করতে সক্ষম হবে, অ প্রাইভেট ফাংশনগুলির সাথে ওভারলোড হওয়া অ্যাক্সেসযোগ্য ব্যক্তিগত ফাংশন সহ - যদি ব্যক্তিগত ফাংশনটি আরও ভাল ম্যাচ হয়, কলিং কোডটি সংকলন করতে ব্যর্থ হবে। (সি ++ সুরক্ষার কারণে অ্যাক্সেসযোগ্যতা যাচাইয়ের আগে ওভারলোড রেজোলিউশন সম্পাদনের ইচ্ছাকৃত নকশার সিদ্ধান্ত নিয়েছিল For উদাহরণস্বরূপ, অনুভূত হয়েছিল যে কোনও ফাংশনের অ্যাক্সেসিবিলিটি ব্যক্তিগত থেকে জনসাধারণে পরিবর্তন করা উচিত আইনী কলিং কোডের অর্থ পরিবর্তন করা উচিত নয়))

সুটার অবশ্যই কমিটির সদস্য হিসাবে একটি অত্যন্ত নির্ভরযোগ্য উত্স, তাই তিনি যখন একটি দেখেন তখন তিনি "একটি ইচ্ছাকৃত নকশার সিদ্ধান্ত" জানেন। পরিবর্তিত শব্দার্থবিজ্ঞান বা দুর্ঘটনাক্রমে ভাঙ্গা অ্যাক্সেসিবিলিটি পরে এড়ানোর উপায় হিসাবে ব্যক্তিগত পদ্ধতিগুলির জনসমক্ষে ঘোষণার প্রয়োজনের ধারণাটি সম্ভবত সবচেয়ে দৃinc়প্রত্যয়ী যুক্তি। ধন্যবাদ, পুরো জিনিসটি এখনকার চেয়ে বরং অর্থহীন বলে মনে হয়েছিল!


" তবে আপনি জিজ্ঞাসা করছেন কেন, এবং সেই উত্তরটি টোটোলজিকাল বলে মনে হচ্ছে Again আবার, শ্রেণীর ব্যবহারকারীদের কেন তাদের সম্পর্কে জানা দরকার? " না, এটি টোটোলজিক্যাল নয়। ব্যবহারকারীরা অগত্যা "তাদের সম্পর্কে জানা দরকার" না। যা হওয়ার দরকার তা হ'ল আপনাকে শ্রেণীর লেখকের সম্মতি ব্যতীত লোকদের ক্লাস বাড়ানো থেকে বিরত রাখতে সক্ষম হতে হবে। সুতরাং এই জাতীয় সমস্ত সদস্যকে অবশ্যই সম্মুখ-ঘোষিত হতে হবে। এর ফলে ব্যবহারকারীরা ব্যক্তিগত সদস্যদের সম্পর্কে জানতে চান এটি কেবল একটি প্রয়োজনীয় পরিণতি necessary
নিকল বোলাস

1
@ নিকলবোলাস অবশ্যই এটি সম্ভবত আমার পক্ষে খুব ভাল শব্দ ছিল না। আমি বোঝাতে চাইছি যে উত্তরটি কেবলমাত্র একটি ব্যক্তিগত পদ্ধতিগুলির দৃশ্যমানতার ব্যাখ্যা দেয় যা একটি (খুব কার্যকর) নিয়মের ফলাফল হিসাবে বিশেষত ব্যক্তিগত পদ্ধতির দৃশ্যমানতার বিষয়ে যুক্তি সরবরাহ করার পরিবর্তে অনেকগুলি বিষয়কে কভার করে। অবশ্যই, আসল উত্তরটি ব্যবহারহীন, জ্ঞানসার এবং আমার একটি সংমিশ্রণ। আমি কেবলমাত্র অন্য দৃষ্টিভঙ্গি সরবরাহ করতে চাই যা এখনও এখানে ছিল না।
আন্ডারস্কোর_১

4

এটি করার দুটি কারণ রয়েছে।

প্রথমে অনুধাবন করুন যে অ্যাক্সেস স্পেসিফায়ার সংকলকটির জন্য , এবং রানটাইম প্রাসঙ্গিক নয়। সুযোগের বাইরে কোনও প্রাইভেট সদস্য অ্যাক্সেস করা একটি সংকলন ত্রুটি।

সংক্ষিপ্ত রুপ

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

আপনি বরং শিরোনামে একটি দ্রুত বা দুটি লাইন পেতে চান, বা ফাংশন প্রোটোটাইপ আছে এবং কোথাও একটি বাস্তবায়ন? শিরোনামে এটি সন্ধান করা সহজ এবং সংক্ষিপ্ত ফাংশনগুলির জন্য পৃথক বাস্তবায়ন করা অনেক বেশি ভারবস ose

আরও একটি বড় সুবিধা রয়েছে, যা হ'ল ...

ইনলাইন ফাংশন

একটি ব্যক্তিগত ফাংশন ইনলাইন হতে সক্ষম হতে পারে এবং এটি প্রয়োজনীয়ভাবে এটির শিরোনামে থাকা প্রয়োজন। এই বিবেচনা:

class A {
  private:
    inline void myPrivateFunction() {
      ...
    }

  public:
    inline void somePublicFunction() {
      myPrivateFunction();
      ...
    }
};

ব্যক্তিগত ফাংশন পারে পাবলিক ফাংশন সহ inlined করা সক্ষম হবেন। এটি সংকলকের বিচক্ষণতার সাথে সম্পন্ন হয়েছে, কারণ মূল inlineশব্দটি প্রযুক্তিগতভাবে একটি পরামর্শ , প্রয়োজন নয়।


শ্রেণীর দেহের অভ্যন্তরে সংজ্ঞায়িত সমস্ত ফাংশনগুলি স্বয়ংক্রিয়ভাবে চিহ্নিত হয়ে যায় inline, কীওয়ার্ডটি ব্যবহার করার কোনও কারণ নেই।
বেন ভয়েগট

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

আমি মনে করি না কোনও পদ্ধতি সন্নিবেশ করানোর জন্য শিরোনামে থাকা দরকার। এটি কেবল একই সংকলন ইউনিটে থাকা দরকার। এমন কোনও মামলা আছে যেখানে কোনও শ্রেণীর জন্য পৃথক সংকলন ইউনিট থাকা বোঝা যায়?
স্যামুয়েল ড্যানিয়েলসন

@ সামুয়েলডানিয়েলসন সঠিক, তবে একটি ব্যক্তিগত ফাংশন অবশ্যই শ্রেণির সংজ্ঞায় থাকতে হবে। "প্রাইভেট" এর খুব ধারণাটি বোঝায় এটি শ্রেণীর অংশ of .cppশ্রেণীর সংজ্ঞার বাইরে সংজ্ঞায়িত সদস্য ফাংশনগুলির দ্বারা অন্তর্নিহিত ফাইলে একটি ননমেম্বার ফাংশন থাকা সম্ভব হবে তবে এই জাতীয় ফাংশনটি ব্যক্তিগত হবে না।

প্রশ্নের মূল অংশটি ছিল " শ্রেণীর সংজ্ঞায় ব্যক্তিগত কাজগুলি ঘোষণার কোনও কারণ আছে [sic, যার প্রেক্ষাপটে ওপি সত্যই শ্রেণীর ঘোষণাকে বোঝায়]"। আপনি ব্যক্তিগত ফাংশন সংজ্ঞায়নের কথা বলছেন। এটি প্রশ্নের উত্তর দেয় না। @ সামুয়েলডানিয়েলসন আজকাল এলটিও এর অর্থ ফাংশনগুলি কোনও প্রকল্পে যে কোনও জায়গায় থাকতে পারে এবং ইনলাইন হওয়ার সমান সুযোগ বজায় রাখতে পারে। একাধিক অনুবাদ ইউনিটে কোনও শ্রেণিকে বিভক্ত করার ক্ষেত্রে, সর্বাধিক সহজ বিষয়টি হল শ্রেণিটি কেবলমাত্র বড় এবং আপনি শব্দার্থভাবে এটি একাধিক উত্স ফাইলগুলিতে বিভক্ত করতে চান। আমি নিশ্চিত যে এ জাতীয় বৃহত শ্রেণি নিরুৎসাহিত হয়েছে তবে যাইহোক
আন্ডারস্কোর_ড

2

হেডার ফাইলে ব্যক্তিগত পদ্ধতি থাকার আরও একটি কারণ: এমন কিছু ক্ষেত্রে রয়েছে যেখানে সর্বজনীন ইনলাইন পদ্ধতিতে এক বা একাধিক ব্যক্তিগত পদ্ধতি কল করার চেয়ে বেশি কিছু হয় না। শিরোনামে ব্যক্তিগত পদ্ধতি থাকার অর্থ পাবলিক পদ্ধতির কাছে কলটি প্রাইভেট পদ্ধতির আসল কোডের সাথে পুরোপুরি .োকানো যেতে পারে এবং ব্যক্তিগত পদ্ধতিতে কল করার সাথে ইনলাইনিং বন্ধ হয় না। এমনকি একটি পৃথক সংকলন ইউনিট থেকে (এবং সর্বজনীন পদ্ধতিগুলি সাধারণত বিভিন্ন সংকলন ইউনিট থেকে ডাকা হত )।

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


ইনলাইনিং সম্পর্কে দুর্দান্ত পয়েন্ট! আমি কল্পনা করি যে এটি স্ট্যান্ডলিব এবং অন্যান্য লাইব্রেরিগুলির জন্য ইনলাইন নির্ধারিত পদ্ধতি সহ বিশেষত প্রাসঙ্গিক। (যদি অভ্যন্তরীণ কোডের জন্য এতটা না হয়, যেখানে এলটিও টিইউ সীমানা জুড়ে প্রায় কিছু করতে পারে)
আন্ডারস্কোর_ড

0

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

কোনও ফাংশন যদি শ্রেণীর ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে তবে ব্যক্তিগতটি অকেজো হবে।


1
হতে পারে আমার প্রশ্নে আরও স্পষ্ট হওয়া উচিত ছিল - আমি বোঝাতে চেয়েছিলাম কেন ভাষাটি এইভাবে ডিজাইন করা হয়েছে? এটি অবশ্যই হবে বা কেন এই নকশাটি একটি ভাল?
প্রেক্সোলিটিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.