শ্রেণি এবং অবজেক্টস: প্রকৃতপক্ষে আমাকে কতগুলি এবং কোন ধরণের ফাইলগুলি ব্যবহার করা উচিত?


20

সি ++ বা সি নিয়ে আমার কোনও পূর্ববর্তী অভিজ্ঞতা নেই তবে কীভাবে সি # প্রোগ্রাম করতে হয় তা জানি এবং আরডুইনো শিখছি। আমি কেবল আমার স্কেচগুলি সংগঠিত করতে চাই এবং তার সীমাবদ্ধতা থাকা সত্ত্বেও আরডিনো ভাষার সাথে বেশ স্বাচ্ছন্দ্য বোধ করি তবে আমি সত্যিই আমার আরডুইনো প্রোগ্রামিংয়ের জন্য একটি অবজেক্ট-ভিত্তিক দৃষ্টিভঙ্গি রাখতে চাই।

সুতরাং আমি দেখেছি যে কোডগুলি সংগঠিত করার জন্য আপনার নিম্নোক্ত উপায়গুলি (সম্পূর্ণ তালিকা নয়) থাকতে পারে:

  1. একটি একক .ino ফাইল;
  2. একই ফোল্ডারে একাধিক .ino ফাইল (আইডিই কল করে এবং "ট্যাবগুলি" এর মতো প্রদর্শন করে);
  3. একই ফোল্ডারে অন্তর্ভুক্ত .h এবং .cpp ফাইল সহ একটি .ino ফাইল;
  4. উপরের মতো একই, তবে ফাইলগুলি আরডুইনো প্রোগ্রাম ফোল্ডারের ভিতরে একটি ইনস্টল করা লাইব্রেরি।

আমি নিম্নলিখিত উপায়গুলি সম্পর্কে শুনেছি, কিন্তু সেগুলি এখনও কাজ করে নি:

  • একটি সি ++ - একই, একক .ino ফাইলে স্টাইলের ক্লাস ঘোষণা করা (শুনেছেন, তবে কখনও কাজ করতে দেখেননি - এটি কি সম্ভব?);
  • [পছন্দসই পদ্ধতির] একটি ক্লাস ঘোষণা করা হয় এমন একটি .cpp ফাইল সহ, কিন্তু একটি .h ফাইল ব্যবহার না করে (এই পদ্ধতির পছন্দ করা উচিত, সেই কাজটি করা উচিত?);

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


আগ্রহীদের জন্য, এখানে শিরোনামহীন (কেবলমাত্র সিপিপি) শ্রেণীর সংজ্ঞা সম্পর্কে একটি আকর্ষণীয় আলোচনা রয়েছে: প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জিং.
com

উত্তর:


31

আইডিই কীভাবে জিনিসগুলিকে সংগঠিত করে

প্রথম জিনিস, এইভাবে আইডিই আপনার "স্কেচ" সংগঠিত করে:

  • প্রধান .ino। ফাইল ফোল্ডার এটি তাই হয়, হিসাবে একই নামের এক foobar.inoমধ্যে foobarফোল্ডারের - প্রধান ফাইল foobar.ino হয়।
  • .inoসেই ফোল্ডারে থাকা অন্য যে কোনও ফাইল মূল ফাইলের শেষে (বর্ণানুক্রমিকভাবে মূল ফাইল যেখানেই থাকুক না কেন) বর্ণমালা অনুসারে একত্রে সংযুক্ত করা হয়।
  • এই সংমিশ্রিত ফাইলটি একটি ফাইল হয়ে যায় .cpp(উদা। foobar.cpp) - এটি একটি অস্থায়ী সংকলন ফোল্ডারে স্থাপন করা হয়।
  • প্রিপ্রসেসর "সহায়কভাবে" ফাংশন প্রোটোটাইপগুলি জেনারেট করে যা এই ফাইলটিতে এটি খুঁজে পাওয়া যায়।
  • প্রধান ফাইলটি #include <libraryname>নির্দেশের জন্য স্ক্যান করা হয় । এটি আইডিইটিকে প্রতিটি (উল্লিখিত) লাইব্রেরি থেকে সমস্ত প্রাসঙ্গিক ফাইলগুলি অস্থায়ী ফোল্ডারে অনুলিপি করতে এবং সেগুলি সংকলনের জন্য নির্দেশাবলী উত্সাহিত করে।
  • যে কোনও .c, .cppবা .asmস্কেচ ফোল্ডারে থাকা ফাইলগুলি পৃথক সংকলন ইউনিট হিসাবে বিল্ড প্রক্রিয়াতে যুক্ত করা হয় (এটি সাধারণ ফাইল হিসাবে পৃথক ফাইল হিসাবে সংকলিত হয়)
  • যে কোনও .hফাইল অস্থায়ী সংকলন ফোল্ডারেও অনুলিপি করা হয়, যাতে সেগুলি আপনার .c বা .cpp ফাইলগুলি দ্বারা উল্লেখ করা যেতে পারে।
  • সংকলকটি বিল্ড প্রসেসের স্ট্যান্ডার্ড ফাইলগুলিতে যুক্ত করে (যেমন main.cpp)
  • বিল্ড প্রক্রিয়াটি তারপরে উপরের সমস্ত ফাইলকে বস্তু ফাইলগুলিতে সংকলন করে।
  • সংকলন পর্বটি সফল হলে তারা এভিআর স্ট্যান্ডার্ড লাইব্রেরিগুলির সাথে একত্রে লিঙ্কযুক্ত রয়েছে (যেমন, আপনাকে দেওয়া strcpyইত্যাদি)

এই সমস্তের একটি পার্শ্ব-প্রতিক্রিয়া হ'ল আপনি মূল স্কেচটি (.ino ফাইলগুলি) সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে সি ++ হিসাবে বিবেচনা করতে পারেন। ফাংশন প্রোটোটাইপ জেনারেশন তবে আপনি যদি সাবধান না হন তবে অস্পষ্ট ত্রুটি বার্তাগুলি নিয়ে যেতে পারে।


প্রাক-প্রসেসরের কৌতুক এড়ানো

এই আইডিসিক্রেন্সিগুলি এড়ানোর সহজ উপায় হ'ল আপনার মূল স্কেচটি ফাঁকা ছেড়ে দেওয়া (এবং অন্য কোনও .inoফাইল ব্যবহার না করা)। তারপরে অন্য একটি ট্যাব তৈরি করুন (একটি .cppফাইল) এবং আপনার স্টাফগুলিকে এটি এর মধ্যে :ুকিয়ে দিন:

#include <Arduino.h>

// put your sketch here ...

void setup ()
  {

  }  // end of setup

void loop ()
  {

  }  // end of loop

নোট করুন যে আপনি অন্তর্ভুক্ত করা প্রয়োজন Arduino.h। আইডিই এটি স্বয়ংক্রিয়ভাবে মূল স্কেচের জন্য করে তবে অন্যান্য সংকলন ইউনিটের জন্য আপনাকে এটি করতে হবে। অন্যথায় এটি স্ট্রিং, হার্ডওয়্যার রেজিস্টার ইত্যাদির মতো জিনিস সম্পর্কে জানতে পারবে না


সেটআপ / মূল দৃষ্টান্ত এড়ানো

আপনাকে সেটআপ / লুপ ধারণাটি নিয়ে চলতে হবে না। উদাহরণস্বরূপ, আপনার .cpp ফাইলটি হতে পারে:

#include <Arduino.h>

int main ()
  {
  init ();  // initialize timers
  Serial.begin (115200);
  Serial.println ("Hello, world");
  Serial.flush (); // let serial printing finish
  }  // end of main

জোর করে গ্রন্থাগার অন্তর্ভুক্তি

আপনি যদি "খালি স্কেচ" ধারণাটি নিয়ে চালিত হন তবে আপনাকে প্রকল্পের অন্য কোথাও ব্যবহৃত লাইব্রেরি অন্তর্ভুক্ত করতে হবে, উদাহরণস্বরূপ আপনার মূল .inoফাইলটিতে:

#include <Wire.h>
#include <SPI.h>
#include <EEPROM.h>

আইডিই কেবল লাইব্রেরি ব্যবহারের জন্য মূল ফাইলটি স্ক্যান করে কারণ এটি। কার্যকরভাবে আপনি মূল ফাইলটিকে একটি "প্রকল্প" ফাইল হিসাবে বিবেচনা করতে পারেন যা কোন বাহ্যিক লাইব্রেরি ব্যবহার করছে তা মনোনীত করে।


নামকরণ সমস্যা

  • আপনার মূল স্কেচের নাম রাখবেন না "মেইন সিপিপি" - আইডিইতে তার নিজস্ব মেইন সিপিপি অন্তর্ভুক্ত থাকে যাতে আপনি এটি করেন তবে একটি নকল থাকবে।

  • আপনার মূল .ino ফাইলের মতো একই নামে আপনার .cpp ফাইলটির নাম রাখবেন না। যেহেতু .ino ফাইল কার্যকরভাবে একটি .cpp ফাইল হয়ে যায় এটি আপনাকে একটি নাম সংঘাত দেয় clash


একটি সি ++ - একই, একক .ino ফাইলে স্টাইলের ক্লাস ঘোষণা করা (শুনেছেন, তবে কখনও কাজ করতে দেখেননি - এটি কি সম্ভব?);

হ্যাঁ, এটি ঠিক আছে:

class foo {
  public:
};

foo bar;

void setup () { }
void loop () { }

তবে আপনি সম্ভবত সাধারন অনুশীলনগুলি অনুসরণ করতে সবচেয়ে ভাল: আপনার ঘোষণাগুলি .hফাইলগুলিতে এবং আপনার সংজ্ঞাগুলি (বাস্তবায়ন )গুলিতে .cpp(বা .c) ফাইলগুলিতে রাখুন।

"সম্ভবত" কেন?

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

যদি এই শ্রেণিটি তখন আপনার প্রকল্পে অন্য একাধিক ফাইলে ব্যবহৃত হয় তবে এটিই আলাদা .hএবং .cppফাইলগুলি খেলতে আসে।

  • .hফাইল ঘোষণা বর্গ - যে, এটা জানা এটি কী অন্যান্য ফাইল জন্য যথেষ্ট বিস্তারিত, এটা আছে কি ফাংশন প্রদান করে, এবং তারা কিভাবে বলা হয়।

  • .cppফাইল সংজ্ঞায়িত (কার্যকরী) বর্গ - যে, এটা আসলে ফাংশন, এবং স্ট্যাটিক বর্গ সদস্যদের প্রদান করে, যে বর্গ করা তার জিনিস করে। যেহেতু আপনি কেবল একবার এটি প্রয়োগ করতে চান, এটি পৃথক ফাইলে।

  • .hফাইল কি অন্যান্য ফাইল অন্তর্ভুক্ত পরার। .cppফাইল বর্গ ফাংশন বাস্তবায়ন আইডিই একবার কম্পাইল করা হয়।

লাইব্রেরি

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

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


এখানে আরও কিছু বিশদ ।


চমৎকার উত্তর. সবচেয়ে গুরুত্বপূর্ণ বিষয়, যদিও, স্পষ্ট আমাকে এখনো ওঠে হয়নি কেন সবাই বলে "তুমি সম্ভবত শ্রেষ্ঠ বন্ধ স্বাভাবিক অনুশীলন অনুসরণ করতে: জ + + .cpp"? কেন এটা ভাল? কেন সম্ভবত অংশ? এবং সর্বাধিক গুরুত্বপূর্ণ: আমি কীভাবে এটি করতে পারি না , অর্থাত্, একই, একক .cpp ফাইলে উভয় ইন্টারফেস এবং বাস্তবায়ন (থ্যাসটি হ'ল, পুরো ক্লাস কোড) থাকে? আপাতত আপনাকে অনেক ধন্যবাদ! : ও)
হেলটনবাইকার

আপনার সম্ভবত পৃথক ফাইল থাকা উচিত বলে "সম্ভবত" উত্তর দেওয়ার জন্য আরও কয়েকটি অনুচ্ছেদ যুক্ত হয়েছে।
নিক দম্ভোক্তি

1
কীভাবে করবেন না ? আমার উত্তরে বর্ণিত হিসাবে কেবল তাদের সবাইকে একসাথে রাখুন তবে আপনি দেখতে পাচ্ছেন যে প্রিপ্রোসেসর আপনার বিরুদ্ধে কাজ করে। কিছু পুরোপুরি বৈধ সি ++ শ্রেণীর সংজ্ঞা ব্যর্থ হয় যদি সেগুলি মূল .ino ফাইলে রাখা হয়।
নিক গ্যামন

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

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

6

আমার পরামর্শটি হ'ল জিনিসগুলি করার সি +++ পদ্ধতিতে অবিচল থাকা: প্রতিটি শ্রেণীর জন্য .h এবং .cpp ফাইলগুলিতে পৃথক ইন্টারফেস এবং বাস্তবায়ন।

কয়েকটি ক্যাচ রয়েছে:

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

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


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

এটি সংকলক / লিঙ্কারের কাজকে সহজতর করে এবং আপনি .cpp ফাইল উপাদানগুলিতে যা ক্লাসের অংশ নয়, তবে কিছু পদ্ধতিতে ব্যবহার করা যায়। এবং যদি ক্লাসে স্থির মিমার থাকে তবে আপনি সেগুলি .h ফাইলে রাখতে পারবেন না।
ইগোর স্টপপা

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

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

6

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

Blinker.ino

#include <TurnSignals.cpp>

TurnSignals turnSignals(2, 4, 8);

void setup() { }

void loop() {
  turnSignals.run();
}

TurnSignals.cpp

#include "Arduino.h"

class TurnSignals
{
    int 
        _left, 
        _right, 
        _buzzer;

    const int 
        amberPeriod = 300,

        beepInFrequency = 600,
        beepOutFrequency = 500,
        beepDuration = 20;    

    boolean
        lightsOn = false;

    public : TurnSignals(int leftPin, int rightPin, int buzzerPin)
    {
        _left = leftPin;
        _right = rightPin;
        _buzzer = buzzerPin;

        pinMode(_left, OUTPUT);
        pinMode(_right, OUTPUT);
        pinMode(_buzzer, OUTPUT);            
    }

    public : void run() 
    {        
        blinkAll();
    }

    void blinkAll() 
    {
        static long lastMillis = 0;
        long currentMillis = millis();
        long elapsed = currentMillis - lastMillis;
        if (elapsed > amberPeriod) {
            if (lightsOn)
                turnLightsOff();   
            else
                turnLightsOn();
            lastMillis = currentMillis;
        }
    }

    void turnLightsOn()
    {
        tone(_buzzer, beepInFrequency, beepDuration);
        digitalWrite(_left, HIGH);
        digitalWrite(_right, HIGH);
        lightsOn = true;
    }

    void turnLightsOff()
    {
        tone(_buzzer, beepOutFrequency, beepDuration);
        digitalWrite(_left, LOW);
        digitalWrite(_right, LOW);
        lightsOn = false;
    }
};

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