সি ++ তে কেন কোনও বেস ক্লাস নেই?


84

ডিজাইনের দৃষ্টিকোণ থেকে, কেন, সি ++ এ, কোনও বেস-ক্লাসের কোনও মা-নেই, সাধারণত objectঅন্যান্য ভাষায় কী থাকে?


27
এটি আসলে কোনও ডিজাইনের প্রশ্নের চেয়ে দার্শনিক প্রশ্ন। সংক্ষিপ্ত উত্তরটি "কারণ বর্জন দৃশ্যত এটি করতে চাননি want"
জেরি কফিন

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

4
@ মার্টিন তবে এটি এটিকে দেখুন: উদাহরণস্বরূপ, সি ++ 0 এক্স অটো অবধি আপনাকে পুনরাবৃত্তকারী বা এক-সময়ের জন্য মাইল-দীর্ঘ টাইপ সংজ্ঞা ব্যবহার করতে হয়েছিল typedef। আরও সাধারণ জেনেরিক শ্রেণিবিন্যাসের সাথে আপনি কেবল ব্যবহার করতে পারেন objectবা iterator
slezica

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

4
@ জিডাব্লুডাব্লু - ... এটি কোনও এসটিএল ধারকগুলির ক্ষেত্রে প্রযোজ্য নয় তা ব্যতীত।
ক্রিস লুটজ

উত্তর:


116

স্ট্রোস্ট্রাপের এফএকিউগুলিতে সুনির্দিষ্ট রায় পাওয়া যায় । সংক্ষেপে, এটি কোনও অর্থপূর্ণ অর্থ বোঝায় না। এতে ব্যয় হবে। টেমপ্লেটগুলি ধারকগুলির জন্য আরও দরকারী।

কেন সি ++ এর সর্বজনীন শ্রেণীর অবজেক্ট নেই?

  • আমাদের একটির দরকার নেই: জেনেরিক প্রোগ্রামিং বেশিরভাগ ক্ষেত্রে স্ট্যাটিকালি টাইপ নিরাপদ বিকল্প সরবরাহ করে। অন্যান্য মামলা একাধিক উত্তরাধিকার ব্যবহার করে পরিচালনা করা হয়।

  • কোনও কার্যকর সার্বজনীন শ্রেণি নেই: সত্যিকারের সর্বজনীন তার নিজস্ব কোনও শব্দার্থ বহন করে না।

  • একটি "সার্বজনীন" শ্রেণি ধরণ এবং ইন্টারফেসগুলি সম্পর্কে opালু চিন্তাকে উত্সাহ দেয় এবং অতিরিক্ত রান-টাইম চেকিংয়ের দিকে পরিচালিত করে।

  • সর্বজনীন বেস শ্রেণি ব্যবহার করে ব্যয় বোঝায়: পলিমারফিক হওয়ার জন্য অবজেক্টগুলি গাদা-বরাদ্দ করতে হবে; এটি মেমরি এবং অ্যাক্সেস ব্যয়কে বোঝায়। গাদা বস্তু স্বাভাবিকভাবে অনুলিপি শব্দার্থবিজ্ঞান সমর্থন করে না। হিপ অবজেক্টস সহজ স্কোপড আচরণকে সমর্থন করে না (যা রিসোর্স ম্যানেজমেন্টকে জটিল করে তোলে)। একটি সর্বজনীন বেস শ্রেণিটি ডায়নামিক_কাস্ট এবং অন্যান্য রান-টাইম চেকিংয়ের ব্যবহারকে উত্সাহ দেয়।


83
আমাদের দরকার নেই / বেস ক্লাস অবজেক্টের / আমাদের দরকার নেই / চিন্তার নিয়ন্ত্রণ প্রয়োজন ...;)
পিসকভোর

4
@ পিসকভর - লোল আমি মিউজিক ভিডিওটি দেখতে চাই!
বায়রন হিটলক

11
Objects must be heap-allocated to be polymorphic- আমি মনে করি না যে এই বিবৃতিটি সাধারণত সঠিক। আপনি অবশ্যই স্ট্যাকের উপর পলিমারফিক ক্লাসের উদাহরণ তৈরি করতে পারেন এবং এটির বেস ক্লাসগুলির মধ্যে একটিতে পয়েন্টার হিসাবে এটি পাঠাতে পারেন, বহুবর্ষচরিত আচরণের ফলন দেয়।
বায়রন

4
জাভা, একটি রেফারেন্স-পারেন- নিক্ষেপ করার চেষ্টা Fooএকটি রেফারেন্স-পারেন- মধ্যে Barযখন Barনা উত্তরাধিকারী Foo, deterministically একটি ব্যতিক্রম ছোঁড়ার। সি ++ তে, পয়েন্টার-টু-বারে পয়েন্টার-টু-ফু castালার চেষ্টা করার সময় সারা কনরকে মেরে ফেলার সময়টিতে একটি রোবট পাঠানো যেতে পারে।
সুপারক্যাট

4
@ সুপের্যাট এজন্যে আমরা ডায়নামিক_কাস্ট <> ব্যবহার করি। স্কাইনেট এড়াতে এবং রহস্যজনকভাবে চেস্টারফিল্ডের সোফাসমূহ উপস্থিত হওয়া।
ক্যাপ্টেন জিরাফি

44

আসুন প্রথমে আপনি কেন প্রথম স্থানে একটি বেস-শ্রেণি করতে চান তা নিয়ে ভাবুন think আমি কয়েকটি ভিন্ন কারণ সম্পর্কে ভাবতে পারি:

  1. জেনেরিক ক্রিয়াকলাপ বা সংগ্রহগুলি সমর্থন করতে যা কোনও প্রকারের অবজেক্টগুলিতে কাজ করবে।
  2. সমস্ত পদার্থের জন্য সাধারণ যা বিভিন্ন প্রক্রিয়া অন্তর্ভুক্ত করা (যেমন মেমরি পরিচালনা)।
  3. সবকিছুই একটি বস্তু (কোনও আদিম নেই!)। কিছু ভাষায় (যেমন অবজেক্টিভ-সি) এগুলি থাকে না, যা জিনিসগুলিকে বেশ জঞ্জাল করে তোলে।

এই দুটি ভাল কারণ যে স্মলটালক, রুবি এবং অবজেক্টিভ-সি ব্র্যান্ডের ভাষার বেস-ক্লাস রয়েছে (প্রযুক্তিগতভাবে, অবজেক্টিভ সি-তে আসলে একটি বেস-ক্লাস নেই, তবে সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে, এটি রয়েছে)।

# 1 এর জন্য, বেস-ক্লাসের প্রয়োজনীয়তা যা একক ইন্টারফেসের অধীনে সমস্ত বস্তুকে এক করে দেয় C ++ তে টেমপ্লেট অন্তর্ভুক্তি দ্বারা বিভক্ত হয়। এই ক্ষেত্রে:

void somethingGeneric(Base);

Derived object;
somethingGeneric(object);

অপ্রয়োজনীয়, যখন আপনি প্যারামেট্রিক পলিমারফিজমের মাধ্যমে সমস্ত ধরণের সততা বজায় রাখতে পারেন!

template <class T>
void somethingGeneric(T);

Derived object;
somethingGeneric(object);

# 2 এর জন্য, যদিও অবজেক্টিভ-সি তে, মেমরি পরিচালনার পদ্ধতিগুলি কোনও শ্রেণীর প্রয়োগের অংশ, এবং বেস বর্গ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, সি ++ এ মেমরি পরিচালনা উত্তরাধিকারের পরিবর্তে রচনা ব্যবহার করে সঞ্চালিত হয়। উদাহরণস্বরূপ, আপনি একটি স্মার্ট পয়েন্টার মোড়ক সংজ্ঞায়িত করতে পারেন যা কোনও ধরণের বস্তুর উপর রেফারেন্স গণনা সম্পাদন করবে:

template <class T>
struct refcounted
{
  refcounted(T* object) : _object(object), _count(0) {}

  T* operator->() { return _object; }
  operator T*() { return _object; }

  void retain() { ++_count; }

  void release()
  {
    if (--_count == 0) { delete _object; }
  }

  private:
    T* _object;
    int _count;
};

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

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

সুতরাং, আপনার প্রশ্নের সংক্ষিপ্ত উত্তর: সি ++ এর বেস-ক্লাস নেই কারণ টেমপ্লেটগুলির মাধ্যমে প্যারামেট্রিক পলিমারফিজম থাকার দরকার নেই।


ঠিক আছে! খুশি
জোনাথন স্টার্লিং

4
পয়েন্ট 3 এর জন্য, আমি সি # এর সাথে পাল্টাচ্ছি। সি # এর আদিম রয়েছে যা ( ) এর সাথে বাক্সযুক্ত হতে পারে তবে সেগুলি হওয়ার দরকার নেই। সংকলকটির জন্য, এবং উপস্বাদ হয় এবং বিনিময়যোগ্যভাবে ব্যবহার করা যেতে পারে; প্রয়োজন সময় রানটাইম বক্সিং পরিচালনা করে। objectSystem.ObjectintSystem.Int32
কোল জনসন

সি ++ তে বক্সিং করার দরকার নেই। টেমপ্লেটগুলি সহ, সংকলক সংকলনের সময় সঠিক কোড উত্পন্ন করে।
রব কে

4
দয়া করে নোট করুন যে এটির (পুরানো) উত্তরটি একটি রেফারেন্স গণনা করা স্মার্ট পয়েন্টার দেখায়, সি ++ 11 এখন রয়েছে std::shared_ptrযা পরিবর্তে ব্যবহার করা উচিত।

15

সি ++ ভেরিয়েবলের প্রভাবশালী দৃষ্টান্তটি পাস-বাই-রেফ নয়, পাস-বাই-রেফ। সমস্ত কিছুকে রুট থেকে উত্সাহিত করতে বাধ্য করা Objectতাদেরকে একটি ত্রুটি আইপিএস ফ্যাক্টোর দ্বারা মূল্য দিয়ে যায়।

(কারণ কোনও বস্তুকে প্যারামিটার হিসাবে মান হিসাবে গ্রহণ করা, সংজ্ঞায়িতভাবে এটি কেটে ফেলা হবে এবং এর আত্মাকে সরিয়ে ফেলবে)।

এটি অপ্রয়োজনীয়। সি ++ আপনাকে মান প্রদান করে বা রেফারেন্স শব্দার্থবিজ্ঞান চাইছিল কিনা তা সম্পর্কে আপনাকে ভাবিয়ে তোলে, আপনাকে পছন্দ দেয়। পারফরম্যান্স কম্পিউটিংয়ে এটি একটি বড় বিষয়।


4
এটি নিজের ত্রুটি হবে না। টাইপ হায়ারার্কিগুলি ইতিমধ্যে বিদ্যমান এবং উপযুক্ত হওয়ার সাথে সাথে তারা পাস-বাই-মানটি বেশ ভালভাবে ব্যবহার করে। তবে এটি আরও হিপ-ভিত্তিক কৌশলগুলিকে উত্সাহিত করবে যেখানে পাস-বাই-রেফারেন্সটি আরও উপযুক্ত।
ডেনিস জিকফুজের

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

5

সমস্যাটি হ'ল সি ++ তে এই জাতীয় টাইপ রয়েছে! এটা হয় void। :-) যে কোনও পয়েন্টারকে নিরাপদে অন্তর্নিহিতভাবে কাস্ট করা যেতে পারে void *, এতে বেসিক টাইপের পয়েন্টার সহ, ভার্চুয়াল টেবিলবিহীন ক্লাস এবং ভার্চুয়াল টেবিল সহ ক্লাস রয়েছে।

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

সুতরাং, এই ধরনের আছে। এটি ভাষার স্বল্প-স্তরের প্রকৃতির কারণে কেবল খুব সংক্ষিপ্ততর (আসলে খালি) ইন্টারফেস সরবরাহ করে। :-)


পয়েন্টার ধরণের এবং অবজেক্টের ধরণগুলি এক নয়। আপনার কোনও ধরণের অবজেক্ট থাকতে পারে না void
কেভিন পানকো

4
আসলে, সি ++ এ উত্তরাধিকার সাধারণত এইভাবে কাজ করে। এটি করায় সর্বাধিক গুরুত্বপূর্ণ কাজগুলির মধ্যে একটি হ'ল পয়েন্টার এবং রেফারেন্স ধরণের সামঞ্জস্যতা: যেখানে কোনও শ্রেণীর কাছে পয়েন্টার প্রয়োজন হয়, সেখানে উত্পন্ন শ্রেণীর জন্য একটি পয়েন্টার দেওয়া যেতে পারে। এবং দুটি ধরণের মধ্যে স্থির_কাস্ট পয়েন্টার করার দক্ষতা হ'ল একটি শ্রেণিবিন্যাসের সাথে সংযুক্ত রয়েছে এমন একটি চিহ্ন sign এই দৃষ্টিকোণ থেকে, অকার্যকর অবশ্যই সি ++ এর সর্বজনীন বেস শ্রেণি।
এলিওহ

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

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

4
@ এলিওহ সি ++ 11 স্ট্যান্ডার্ড §3.9.1p9 এর সাথে পরামর্শ করার পরে, আমি স্বীকার করি যে voidএটি একটি প্রকার (এবং এর কিছুটা চালাক ব্যবহারের সন্ধান? : পেয়েছিল) তবে এটি এখনও সর্বজনীন বেস শ্রেণি হতে অনেক দীর্ঘ পথ। একটি জিনিসের জন্য, এটি "একটি অসম্পূর্ণ প্রকার যা সম্পূর্ণ করা যায় না" এবং অন্যটির জন্য কোনও void&প্রকার নেই।
বিক্রিস্ট

-2

সি ++ একটি দৃ strongly়ভাবে টাইপ করা ভাষা। তবুও এটি আশ্চর্যজনক যে টেমপ্লেট বিশেষায়নের প্রসঙ্গে এটিতে সর্বজনীন কোনও অবজেক্টের ধরণ নেই।

উদাহরণস্বরূপ, প্যাটার্নটি ধরুন

template <class T> class Hook;
template <class ReturnType, class ... ArgTypes>
class Hook<ReturnType (ArgTypes...)>
{
   ...
   ReturnType operator () (ArgTypes... args) { ... }
};

যা তাত্ক্ষণিকভাবে করা যেতে পারে

Hook<decltype(some_function)> ...;

এখন ধরে নেওয়া যাক আমরা একটি নির্দিষ্ট ফাংশনের জন্য একই চাই। পছন্দ

template <auto fallback> class Hook;
template <auto fallback, class ReturnType, class ... ArgTypes>
class Hook<ReturnType fallback(ArgTypes...)>
{
   ...
   ReturnType operator () (ArgTypes... args) { ... }
};

বিশেষায়িত তাত্পর্য সহ

Hook<some_function> ...

তবে হায়, যদিও ক্লাস টি বিশেষায়নের আগে যে কোনও ধরণের (শ্রেণি বা না) জন্য দাঁড়াতে পারে, এর কোনও সমতুল্য নেই auto fallback(আমি এই সিনট্যাক্সটিকে এই প্রসঙ্গে সর্বাধিক সুস্পষ্ট জেনেরিক নন-টাইপ হিসাবে ব্যবহার করছি) যে কোনওটির পক্ষে দাঁড়াতে পারে বিশেষায়নের আগে নন-টাইপ টেম্পলেট যুক্তি।

সুতরাং সাধারণভাবে এই প্যাটার্নটি টাইপ টেম্পলেট আর্গুমেন্ট থেকে অ-টাইপ টেম্পলেট আর্গুমেন্টে স্থানান্তর করে না।

সি ++ ভাষায় প্রচুর কোণার মতো, উত্তরটি সম্ভবত "কোনও কমিটির সদস্যই এটি নিয়ে ভাবেননি"।


এমনকি যদি (যেমন কিছু) আপনার ReturnType fallback(ArgTypes...)কাজ করে তবে এটি খারাপ নকশা হবে। template <class T, auto fallback> class Hook; template <class ReturnType, class ... ArgTypes> class Hook<ReturnType (ArgTypes...), ReturnType(*fallback)(ArgTypes...)> ...আপনি যা চান তা করে এবং এর টেমপ্লেট প্যারামিটারগুলি Hookধারাবাহিক ধরণের হয়
ক্যালথ

-4

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

সি নিজেই ভাষার মিশ্রণ, সি প্রোগ্রামিং ভাষা এবং এর প্রিপ্রোসেসর or

সি ++ আরও একটি মিশ্রণ যুক্ত করে:

  • বর্গ / অবজেক্টের পদ্ধতির

  • টেম্পলেট

  • এসটিএল

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

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


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

@ টনি: কৌতূহলপূর্ণভাবে, আমি যে বইয়ের উল্লেখ করেছি কেবলমাত্র তারা অন্য ভাষা হিসাবে উল্লেখ করে না এটি হ'ল প্রিপ্রসেসর, যা কেবল আলাদাভাবে বিবেচনা করা one আমি আপনার দৃষ্টিকোণটি বুঝতে পারি, কারণ প্রাকপ্রসেসর নিজের নিজস্ব ইনপুটটিকে আগে পার্স করে। তবে, একটি টেম্প্লেটিং মেকানিজম হ'ল অন্য ভাষা থাকার মতো যা আপনার জন্য সাধারণীকরণ করে। আপনি একটি টেমপ্লেট সিনট্যাক্স প্রয়োগ করেন এবং আপনার কাছে প্রতি একক ধরণের জন্য সংকলক উত্পন্ন ফাংশন থাকবে। আপনি যখন সি তে কোনও প্রোগ্রাম লিখে এবং এটির সি ++
সংকলককে

এসটিএল, এটি একটি অ্যাড-অন হিসাবে দেখা যায়, তবে এটির খুব ব্যবহারিক ক্লাস এবং ধারক রয়েছে যা টেমপ্লেটগুলির মাধ্যমে NATIVELY C ++ এর শক্তি বাড়িয়ে তোলে। এবং আমি যে এনামগুলি বলছিলাম সেগুলি হ'ল নেটিভ এনামগুলি। আপনি যখন বুস্টের কথা বলেন, আপনি তৃতীয় পক্ষের কোডের উপর নির্ভর করছেন যা ভাষার কাছে নাজাতীয়। সি # তে, পুনরাবৃত্তিযোগ্য এবং স্ব-স্কোপড এনাম থাকার জন্য আমাকে বাহ্যিক কিছু অন্তর্ভুক্ত করতে হবে না। সি ++ এ, আমি প্রায়শই যে কৌশলটি ব্যবহার করি তা হ'ল এনুমের শেষ আইটেমটি কল করা - নির্ধারিত মান ব্যতীত, তাই সেগুলি স্বয়ংক্রিয়ভাবে শূন্য থেকে শুরু হয় এবং বর্ধিত হয় - NUM_ITEMS এর মতো কিছু, এবং এটি আমাকে উপরের সীমা দেয়।
সার্জিওল

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

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