এই ক্রেজিটি সি ++ 11 সিনট্যাক্স ==> স্ট্রাক্ট: বার {} ফু {} ;?


168

এটি সম্ভবত সি ++ 11 এর অর্থ কী হতে পারে?

struct : bar {} foo {};

আকর্ষণীয়, আপনি কি এটি কোনও কিছুর জন্য দরকারী বলে মনে করেন? আমি অনুমান করি যে এটি দৃ (়-টাইপযুক্ত (ট্যাগযুক্ত প্রকারের) একক উদাহরণ উত্পন্ন করার কৌশল।
alfC

@ এলএফসি: বিশেষভাবে কার্যকর নয়, না
লাইটনেস রেস

উত্তর:


262

প্রথমত, আমরা একটি বগ-স্ট্যান্ডার্ড বিমূর্ত ইউডিটি (ব্যবহারকারী-সংজ্ঞায়িত প্রকার) নেব:

struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'

আসুন আমরা এটিকেও স্মরণ করি যে আমরা এটি সংজ্ঞায়িত করার সাথে সাথে ইউডিটি ইনস্ট্যান্ট করতে পারি:

struct foo { foo() { cout << "!"; } };          // just a definition

struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"

আসুন উদাহরণগুলি একত্রিত করুন, এবং স্মরণ করুন যে আমরা একটি ইউডিটি সংজ্ঞায়িত করতে পারি যার নাম নেই :

struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'

বেনামে ইউডিটি সম্পর্কে আমাদের আর প্রমাণের দরকার নেই, তাই আমরা খাঁটি ভার্চুয়াল ফাংশন হারাতে পারি। নাম পরিবর্তন instanceকরে foo, আমাদের সাথে বাকি রয়েছে:

struct {} foo;

পেয়ে বন্ধ.


এখন, যদি এই বেনামে UDT কিছু বেস থেকে প্রাপ্ত হয়?

struct bar {};       // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof

শেষ অবধি, সি ++ 11 প্রসারিত সূচনাকারীদের পরিচয় করিয়ে দেয় , যেমন আমরা বিভ্রান্তিকর জিনিসগুলি করতে পারি:

int x{0};

এবং এই:

int x{};

এবং, অবশেষে, এটি:

struct : bar {} foo {};

এটি একটি নামহীন কাঠামো বার থেকে প্রাপ্ত, একটি ফাঁকা প্রারম্ভক দিয়ে ফু হিসাবে ইনস্ট্যান্ট করা ated


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

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

13
@ জর্জিও - দুর্দান্ত অংশটি হ'ল পরিস্থিতি একেবারে বিপরীত; সি ++ 0x ক্রিপ্টিক বা খুব কুরুচিপূর্ণ না হয়ে অনেক অনেক প্রত্যাশিত শক্তিশালী সুবিধা যুক্ত করছে; আপনি ক্রিপ্টিক চান? - পার্ল চেক আউট এই উদাহরণটি এখানে কোথাও ক্রিপ্টিক শিরোনামের কাছে প্রায় নেই।
জিন বুশুয়েভ

18
@ কেরেক এসবি আমার মনে হয় সি ++ (এবং এখন সি ++ 0x) এর অনেকগুলি ভিন্ন ধারণা রয়েছে এবং বাক্য গঠন এবং শব্দার্থবিদ্যা শেখা কঠিন। প্রতিটি প্রোগ্রামার (আমি তাদের মধ্যে একজন) ভাষার একটি উপসেট ব্যবহার করে শেষ করি কারণ একই জিনিস করার অনেকগুলি বিভিন্ন উপায় রয়েছে। আমি মনে করি না যে সি ++ ভালভাবে ডিজাইন করা হয়েছে। এখানে অনেকগুলি অ্যাড-হক বৈশিষ্ট্য রয়েছে এবং একটি শক্তিশালী মডিউল (আমদানি / রফতানি) প্রক্রিয়া যেমন কিছু মৌলিক জিনিস অনুপস্থিত (এখনও সি থেকে পুরানো # অন্তর্ভুক্ত ব্যবহার করছে)। আমি মনে করি সি ++ 0x প্রচেষ্টার লক্ষ্য হওয়া উচিত সি ++ আরও ছোট এবং ব্যবহার করা সহজ, আরও বড় নয়।
জর্জিও

31
@ জর্জিও: সত্যি কথা বলতে, এই জাতীয় যে কোনও প্রয়াসকে সি ++ ভিত্তি থেকে পুনর্নির্মাণের কাজ করতে হবে, অর্থাত একটি নতুন ভাষা তৈরি করতে হবে । এবং এটি করা হয়েছে ... অনেকবার।
অরবিটে লাইটনেস রেস

106

এটি সংজ্ঞায়িত করে:

  • একটি বেনামে কাঠামো,
  • যা প্রকাশ্যে থেকে প্রাপ্ত bar
  • যা ( anonymously) এটি থেকে প্রাপ্ত ব্যতীত অন্য কিছুই সংজ্ঞায়িত করেbar
  • এবং অবশেষে, "foo" নামে একটি উদাহরণ তৈরি করা হয়েছে,
  • একটি খালি প্রারম্ভিক তালিকা সহ

struct : bar {} foo {};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.