আপনি যখন C ++ এ স্ট্রাক্ট বনাম একটি ক্লাস ব্যবহার করবেন?


949

কোন পরিস্থিতিতে সি ++ এ structবনাম ক ব্যবহার করা ভাল class?


47
এটি কেবল সি ++ এর ক্ষেত্রেই প্রযোজ্য নয়, তবে যে কোনও ভাষা যা স্ট্রাক্ট এবং ক্লাস উভয়ই সরবরাহ করে to
জেসন বুটিং 16

3
আমি এখনও একমত নই - আমি এই প্রশ্নটি শব্দার্থিকভাবে কাছে পৌঁছেছি। কিছু প্রযুক্তিগত পার্থক্য হতে পারে, কিন্তু শব্দার্থভাবে, তারা না। স্ট্রাক্টস মান ধরণের তৈরির জন্য সত্যই কার্যকর, শ্রেণি নেই।
জেসন বুটিং 17

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

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

4
এটি শুধুমাত্র সম্মেলনের মাধ্যমে সত্য। ডিফল্ট এনক্যাপসুলেশন বাদে কোনও পার্থক্য নেই।
ডেভ হিলিয়ার

উত্তর:


804

সি ++ এ classএবং এ এর মধ্যে পার্থক্য structহ'ল স্ট্রাক্টের ডিফল্ট publicসদস্য এবং ঘাঁটি থাকে এবং শ্রেণিতে ডিফল্ট privateসদস্য এবং ঘাঁটি থাকে। উভয় শ্রেণীর এবং structs মিশ্রণ থাকতে পারে public, protectedএবং privateসদস্য, উত্তরাধিকার ব্যবহার করতে পারেন ও সদস্য ফাংশন থাকতে পারে।

আমি স্ট্রাক্টগুলি কোনও শ্রেণিবদ্ধ বৈশিষ্ট্য ছাড়াই প্লেইন-পুরাতন-ডেটা স্ট্রাকচার হিসাবে ব্যবহার privateকরার এবং ডেটা এবং সদস্য ফাংশন সহ সামগ্রিক ডেটা স্ট্রাকচার হিসাবে ক্লাস ব্যবহার করার পরামর্শ দেব ।


99
কোনও সংশোধনকারী বা পদ্ধতিবিহীন স্ট্রাক্টকে পিওড স্ট্রাক বলা হয় যা সি লাইব্রেরির সাথে পিছনের দিকের সামঞ্জস্যপূর্ণ ইন্টারফেস হিসাবে উপস্থিত কারণ এটি মনে করা হয় যে এটি সি স্ট্রাক্টের মতো ছড়িয়ে দেওয়ার গ্যারান্টিযুক্ত। যদিও এই ব্যতিক্রম বাদে কেবলমাত্র পার্থক্যটি বলা হয়েছে।
workmad3

26
@ ওয়ার্কমড ৩: নামটি বিভ্রান্তিমূলক, তবে 9/4 (সি ++ 03) বলেছেন: "পিওড-স্ট্রাক্ট একটি সামগ্রিক শ্রেণি যা নন-পিওডি-স্ট্রাক্ট, নন-পিওডি-ইউনিয়ন জাতীয় স্ট্যাটাসের কোনও সদস্য নয় has (বা এই জাতীয় ধরণের অ্যারে) বা রেফারেন্স এবং এতে কোনও ব্যবহারকারী-সংজ্ঞায়িত অনুলিপি অ্যাসাইনমেন্ট অপারেটর এবং কোনও ব্যবহারকারী-সংজ্ঞায়িত ডেস্ট্রাক্টর নেই "" "স্ট্রাক্ট" শ্রেণি-কী ব্যবহারের ক্ষেত্রে কোনও নিষেধাজ্ঞা নেই এবং "জনসাধারণ" ব্যবহারের ক্ষেত্রে কোনও বিধিনিষেধ নেই (সামগ্রিক প্রয়োজনীয়তার জন্য 8.5.1 / 1 দেখুন)। এটি "কাঠামো" এবং "শ্রেণি" এর মধ্যে কোনও পার্থক্য নয়।

5
আপনার "সামগ্রিক" ব্যবহারের স্ট্যান্ডার্ডের সংজ্ঞা দেওয়া থাকলে ভুল বোঝাবুঝি হতে পারে। :)

3
স্ট্রাস্ট্রপের "নীতি ও অনুশীলন" বই অনুসারে: "স্ট্রাক্টগুলি প্রাথমিকভাবে ব্যবহার করা উচিত যেখানে সদস্যরা কোনও মূল্য নিতে পারে" (যেমন যেখানে কোনও
অর্থবিত্ত

6
সি এর সাথে ইন্টারফেস করার সময় অবশ্যই ক্লাস ব্যবহার করতে পারেন ক্লাস এবং স্ট্রাক্টের মধ্যে কোনও পার্থক্য নেই। স্ট্রাক্টস ক্লাস হয়; কেবলমাত্র ডিফল্ট অ্যাক্সেস ব্যক্তিগত থেকে জনসাধারণে উল্টানো হয়।
সেবাস্তিয়ান মাচ

229

অন্য প্রত্যেকে যেমন মন্তব্য করেছেন যে সত্যিকারের দুটি মাত্র ভাষা পার্থক্য রয়েছে:

  • structসর্বজনীন অ্যাক্সেস classডিফল্ট এবং ব্যক্তিগত অ্যাক্সেস ডিফল্ট।
  • যখন inheriting, structডিফল্টে publicসম্পত্তি ও classডিফল্ট privateউত্তরাধিকার। (হাস্যকরভাবে, সি ++ এর মতো অনেকগুলি জিনিস হিসাবে, ডিফল্টটি পিছনের দিকে: publicউত্তরাধিকার অনেক বেশি সাধারণ পছন্দ, তবে লোকেরা খুব কমই কী কীওয়ার্ড structটাইপ করার সময় সংরক্ষণ করতে " public" ঘোষণা করে ।

তবে অনুশীলনের আসল পার্থক্য হ'ল একটি class/ structযা একজন নির্মাতা / ডেস্ট্রাক্টর এবং যেটি দেয় না তার মধ্যে ঘোষণা করে। একটি "সাধারণ-পুরাতন-ডেটা" পিওডি টাইপের নির্দিষ্ট গ্যারান্টি রয়েছে যা আপনি ক্লাসের নির্মাণের দায়িত্ব নেওয়ার পরে আর প্রযোজ্য না। এই পার্থক্যটি পরিষ্কার রাখার জন্য, অনেক লোক ইচ্ছাকৃতভাবে কেবল structPOD টাইপগুলির জন্য এস ব্যবহার করে এবং যদি তারা কোনও পদ্ধতি যুক্ত করতে চলে তবে classএস ব্যবহার করুন । নীচের দুটি খণ্ডের মধ্যে পার্থক্য অন্যথায় অর্থহীন:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(প্রসঙ্গত, "পিওডি টাইপ" আসলে কী বোঝায় সে সম্পর্কে কিছু ভাল ব্যাখ্যা সহ একটি থ্রেড এখানে রয়েছে: সি ++ এ পিওডি প্রকারগুলি কী? )


উত্তরাধিকারের পার্থক্য সম্পর্কে দুর্দান্ত উদাহরণ: এখানে
লিরান ওরেভি

8
আপনার অবজেক্টটি পিওডি কিনা আপনি কোনও কপিরাইট কনস্ট্রাক্টর / ডেস্ট্রাক্টর সংজ্ঞায়িত করবেন কিনা সে বিষয়ে আপনার কোনও ব্যবহার নেই structবা classনেই be সদস্য ফাংশনগুলির কোনও কোনও পিওডি হওয়ার ক্ষেত্রে কোনও প্রভাব নেই। আপনি যা লিখেছিলেন তা আমি যখন আবার পড়েছি, আমি দেখতে পাচ্ছি আপনি অন্যথায় পরামর্শ দিচ্ছেন না, তবে বর্তমান শব্দটি বিভ্রান্ত করছে
ডেভিড স্টোন

1
@ ডেভিডস্টোন মূলত, পিওড স্ট্রাক্টগুলি সি কোডের সাথে পিছনের দিকে সামঞ্জস্যপূর্ণ বলে গ্যারান্টিযুক্ত বলে মনে করা হয় এবং এটি মূলত কেবল সি-স্টাইল স্ট্রাক্ট হিসাবে ডিজাইন করা বলে মনে করা হয়।
জাস্টিন সময় - মনিকা পুনরায়

3
এই উত্তরের "আসল পার্থক্য" অংশটি সম্পূর্ণ ভুল।
janchopanza

177

বিদ্যমান উত্তরগুলিতে প্রচুর ভুল ধারণা রয়েছে।

উভয় classএবং structএকটি ক্লাস ঘোষণা।

হ্যাঁ, আপনি ক্লাসটি কী কী কীওয়ার্ড ব্যবহার করেছেন তা নির্ভর করে ক্লাস সংজ্ঞাতে আপনার অ্যাক্সেস সংশোধনকারী কীওয়ার্ডগুলিকে পুনর্বিন্যাস করতে হতে পারে।

তবে সিনট্যাক্সের বাইরেও অন্যকে বেছে নেওয়ার একমাত্র কারণ হ'ল কনভেনশন / স্টাইল / পছন্দ।

কিছু লোক structসদস্য ফাংশন ছাড়াই ক্লাসগুলির কীওয়ার্ডটি আটকে রাখতে পছন্দ করে, কারণ ফলাফল সংজ্ঞাটি সি থেকে একটি সাধারণ কাঠামো "মত দেখায়" looks

একইভাবে, কিছু লোক classসদস্য ফাংশন এবং privateডেটা সহ শ্রেণীর জন্য কীওয়ার্ডটি ব্যবহার করতে পছন্দ করে, কারণ এটি এতে "ক্লাস" বলে এবং তাই বস্তু-ভিত্তিক প্রোগ্রামিংয়ে তাদের প্রিয় বইয়ের উদাহরণগুলির মতো দেখায়।

বাস্তবতাটি হ'ল এটি সম্পূর্ণরূপে আপনার এবং আপনার দলের উপর নির্ভর করে এবং এটি আপনার প্রোগ্রামে আক্ষরিক কোনও পার্থক্য আনবে না।

নিম্নলিখিত দুটি শ্রেণীর নাম বাদে প্রতিটি উপায়ে একেবারে সমতুল্য:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

এমনকি পুনরায় বর্ণনার সময় আপনি কীওয়ার্ডগুলি স্যুইচ করতে পারেন:

class Foo;
struct Bar;

(যদিও এটি অ-কনফারেন্সের কারণে ভিজ্যুয়াল স্টুডিও বিল্ড হয় , তাই যখন আপনি এটি করেন তখন সংকলকটি একটি সতর্কতা প্রকাশ করবে))

এবং নিম্নলিখিত প্রকাশগুলি উভয়ই সত্য বলে মূল্যায়ন করে:

std::is_class<Foo>::value
std::is_class<Bar>::value

মনে রাখবেন যে, নতুন সংজ্ঞা দেওয়ার সময় আপনি কীওয়ার্ডগুলি স্যুইচ করতে পারবেন না ; এটি কেবল কারণ (এক-সংজ্ঞা নিয়ম অনুসারে) অনুবাদ ইউনিটগুলিতে ডুপ্লিকেট বর্গ সংজ্ঞাগুলি অবশ্যই "টোকেনের একই ক্রম সমন্বিত" থাকতে হবে । এর অর্থ হল আপনি এমনকি বিনিময় করতে পারবেন না const int member;সঙ্গে int const member;, এবং শব্দার্থবিদ্যা সঙ্গে কিছুই করার আছে classবা struct


15
এটি খুব তথ্যপূর্ণ এবং সত্যই আমার প্রিয় উত্তর ছিল। অন্য প্রত্যেকে তাদের পৃথক সত্তা হিসাবে বিবেচনা করছে, যখন হুডের নীচে, তারা একই হয়। আমি আশ্চর্য করি যে আরডিনো পরিবেশে কোনও কাঠামো সংজ্ঞা সিপিপি শ্রেণি হিসাবে বিবেচনা করা হয়, কারণ এটি জি ++ ব্যবহার করে সংকলিত হয়েছে।
বেনজামিন

4
@ বেন অবশ্যই এটি। আরডুইনো সংকলক সি ++ সংকলন করে; এটাই শেষ।
আন্ডারস্কোর_২২

6
সুতরাং যদি আমি এই অধিকারটি বুঝতে পারি: যতক্ষণ না আপনার দৃশ্যমানতার সংশোধকগুলি স্পষ্ট থাকে, বাদ দেওয়া হয় না, ততক্ষণ তা বিবেচ্য নয়। আপনি স্ট্রাক্ট ছাড়া আর কিছুই ব্যবহার করে বিশাল সি ++ অ্যাপ্লিকেশন লিখতে পারেন; অথবা আপনি স্ট্রাক্টের প্রতিটি ক্ষেত্রে ক্লাসে যেতে এবং পরিবর্তন করতে পারেন। যতক্ষণ না আপনি ডিফল্ট দৃশ্যমানতা ব্যবহার করছেন না, ততক্ষণ অ্যাপ্লিকেশনগুলি একই রকম হবে।
রায়ান লুন্ডি

আমি নিশ্চিত নই যে সি ++ প্রোগ্রামের একটি অনুবাদ ইউনিটের সম্পূর্ণ ঘোষণা থাকতে পারে class foo { public: ... };এবং অন্যটিতে থাকতে পারে struct foo { ... };যা "একেবারে সমতুল্য" দাবী অনুসারে সত্য ধারণ করতে পারে। এটি অসম্পূর্ণ ঘোষণা struct foo;এবং class foo;বিনিময়যোগ্য যে কারণ আসে । এগুলি শ্রেণীর বডি নির্দিষ্ট করে না এবং তাই তারা অ্যাক্সেস লেআউটে কিছুই বলে না।
কাজ

@ কাজ: আপনি ঠিক বলেছেন - সংজ্ঞাগুলি যদি আক্ষরিকভাবে একই ধরণের জন্য হয় তবে আচরণটি ভাল-সংজ্ঞায়িত করার জন্য তাদের অবশ্যই বর্ণনামূলক অভিন্ন হতে হবে। Struct হয়-কি এবং বর্গ কী অন্যথায় কথাটি বিনিময়যোগ্য যদিও (যেখানে শব্দার্থবিদ্যা প্রভাবিত হয় না), এবং Fooএবং Barএখনও সমতুল্য / অভিন্ন ধরনের হয়। আমি নিশ্চিত বলতে "যখন করতে হয়নি redeclaring " এবং একটি উদাহরণ দিতে। এটি ভাবতে আসুন, আমি লোককে
ইউবিতে

54

আমি যখন ক্লাসের পরিবর্তে কোনও কাঠামো ব্যবহার করি তখনই কোনও ফাংশন কলে ব্যবহার করার আগে কোনও ফান্টারকে ডিক্লেয়ার করার সময় এবং স্পষ্টতার জন্য সিনট্যাক্স হ্রাস করতে চাই। উদাহরণ:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

35
এখন এটি বেশ কয়েক বছর পরে এবং সি ++ 11 সমস্ত বড় সংকলক দ্বারা সমর্থিত, লাম্বডাস এটি আরও সংক্ষিপ্ত করে তুলেছে

36

থেকে সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী লাইট :

স্ট্রাক্টের সদস্য এবং বেস ক্লাসগুলি ডিফল্টরূপে সর্বজনীন হয়, শ্রেণিতে, তারা ব্যক্তিগতকে ডিফল্ট করে। দ্রষ্টব্য: আপনার ডিফল্ট উপর নির্ভর না করে আপনার বেস ক্লাসগুলি স্পষ্টভাবে সরকারী, ব্যক্তিগত বা সুরক্ষিত করা উচিত।

কাঠামো এবং শ্রেণি অন্যথায় কার্যত সমতুল্য।

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


1
আমি বুঝতে পারছি না যে তারা স্ট্রাক্ট এবং ক্লাসটি
কার্যত

3
কারণটি কনভেনশন। সংকলকটি আপনি কোনটি ব্যবহার করেন তা বিবেচনা করে না তবে আপনার কোডটির দিকে তাকিয়ে থাকা অন্য বিকাশকারীটির অর্থ আপনি কী বোঝাতে চেয়েছেন তা সহজেই বুঝতে পারে।
তাল প্রেসম্যান

3
@ ডিজেজ: পুরো তৃতীয় অনুচ্ছেদটি যুক্তিযুক্ত।
অরবিটে হালকা ঘোড়দৌড়

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

21

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

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

স্পষ্টতই, আপনি সি তে এটি একই জিনিস করতেন তবে আমি দেখতে পেলাম যে বার্তাটি কোনও শ্রেণিতে ডিকোড করার ওভারহেডটি সাধারণত এটির পক্ষে উপযুক্ত নয়।


সি
তেও

11
অথবা আপনি কেবল ফাংশনটি operator >>লেখার পরিবর্তে কোনও শ্রেণিতে প্রয়োগ করতে পেরেছিলেন processMessage, যা আপনার সি ++কে যথাযথ সি ++ এবং আরও কম সি
নিক বেস্টিন

1
এটি বিভিন্ন সিস্টেমের মধ্যে পোর্টেবল নয়, এগুলি বাইরের নিয়ম লঙ্ঘন করে, তাই এটি কোনও একক স্থাপত্যের মধ্যেও কাজ করার নিশ্চয়তা দেয় না।
আন্ডারস্কোর_২২

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

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

19

আপনি সি ++ তে "স্ট্রাক্ট" ব্যবহার করতে পারেন যদি আপনি এমন একটি লাইব্রেরি লিখছেন যার অভ্যন্তরীণ সি ++ রয়েছে তবে এআইপিআই কে সি বা সি ++ কোড দ্বারা কল করা যেতে পারে। আপনি কেবলমাত্র একটি একক শিরোলেখ তৈরি করেন যাতে স্ট্রাইক এবং গ্লোবাল এপিআই ফাংশন রয়েছে যা আপনি সি এবং সি ++ কোড উভয়কেই প্রকাশ করেছেন:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

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


2
সেরা ফিটনেস উত্তর। সি-সামঞ্জস্যতা সত্যই সবচেয়ে গুরুত্বপূর্ণ কারণ। ডিফল্ট অ্যাক্সেসের মতো অন্যান্য সমস্ত জিনিস গুপ্ত।
ভ্যালেন্টিন হেইনিৎজ 31'15

16

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

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};

1
কিছু সদস্য ফাংশন সহ একটি কাঠামোর উদাহরণ দেওয়ার জন্য +1 যা আপনার "কাঠামোটি কেড়ে নিয়েছে" বলে মনে হয় না।
einpoklum

9

আমার নিজের প্রশ্নের উত্তর দিতে (নির্লজ্জভাবে), যেমন ইতিমধ্যে উল্লিখিত রয়েছে, অ্যাক্সেস সুবিধাগুলি কেবল তাদের মধ্যেই সি ++ তে পার্থক্য।

আমি কেবল ডেটা-স্টোরেজ করার জন্য একটি কাঠামো ব্যবহারের প্রবণতা রাখি। যদি এটি ডেটার সাথে কাজ করা আরও সহজ করে তোলে তবে আমি কয়েকটি সহায়ক ফাংশন পাওয়ার অনুমতি দেব। তবে যত তাড়াতাড়ি ডেটা প্রবাহ নিয়ন্ত্রণের প্রয়োজন (যেমন অভ্যন্তরীণ অবস্থা বজায় রাখে বা সুরক্ষা দেয় এমন গেটর / সেটার) বা কোনও বড় কার্যকারিতা (মূলত আরও বস্তুর মতো) অর্জন করতে শুরু করার সাথে সাথে, এটি উন্নত যোগাযোগের উদ্দেশ্যে আরও একটি শ্রেণিতে 'আপগ্রেড' হয়ে উঠবে।


9

স্ট্রাক্টস ( পিওডি) , আরও সাধারণভাবে) কার্যকর হয় যখন আপনি সি ++ প্রয়োগকরণের সাথে সি-সামঞ্জস্যপূর্ণ ইন্টারফেস সরবরাহ করেন, যেহেতু তারা ভাষা সীমানা এবং লিঙ্কার ফর্ম্যাটগুলি জুড়ে বহনযোগ্য।

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

কাঠামোগুলি বিভিন্ন রূপক কর্মের জন্যও কার্যকর, যেমন বৈশিষ্ট্য টেম্পলেটগুলি যা নির্ভরশীল টাইপডাইফগুলির একগুচ্ছ প্রকাশ করে:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

... তবে এটি কেবল স্ট্রাক্টের ডিফল্ট সুরক্ষা স্তরটি সর্বজনীন হওয়ার সুযোগ নিচ্ছে ...


1
এটি পিওডির সঠিক ব্যবহার নয়। একটি স্ট্রাক্ট (বা শ্রেণি) পিওডি স্ট্রাক্ট হতে পারে যদি (এবং কেবলমাত্র) এতে কেবলমাত্র পিওডি সদস্য থাকে।
মার্টিন ইয়র্ক

4
"অনুমানযোগ্য অনুলিপি শব্দার্থবিজ্ঞান": শব্দার্থবিজ্ঞানগুলি শ্রেণীর জন্য একই (এবং একই সমস্যা রয়েছে (অগভীর অনুলিপি))।
মার্টিন ইয়র্ক

2
এই পোস্টটি আপনি বিশ্বাস করতে পারেন (দুর্ঘটনার দ্বারা আশাকরি) যে সমস্ত স্ট্রাক্টই পিওডি। এটি মোটেও সত্য নয়। আমি আশা করি এর দ্বারা লোকেরা বিভ্রান্ত হবে না।
মাইকেল ডারস্ট

8

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

এটি বলেছিল, আমি সি #+ তে স্ট্রাক্ট ব্যবহার করার মতো ঝোঁক ব্যবহার করছি যেমন আমি # # তে করি, ব্রায়ান যা বলেছিল তার অনুরূপ। স্ট্রাক্টগুলি হ'ল ডেটা ধারক, যখন ক্লাসগুলি অবজেক্টগুলির জন্য ব্যবহৃত হয় যা কেবলমাত্র ধরে রাখা ছাড়াও ডেটাতে কাজ করা প্রয়োজন।


4

তারা প্রায় একই জিনিস। সি ++ এর যাদুটির জন্য ধন্যবাদ, একটি কাঠামো একটি শ্রেণীর মতো "নতুন" ব্যবহার করে তৈরি করা, উত্তরাধিকার ব্যবহার করতে পারে, ফাংশনগুলি ধরে রাখতে পারে

একমাত্র কার্যকরী পার্থক্য হ'ল কোনও শ্রেণীর ব্যক্তিগত অ্যাক্সেস অধিকারগুলির সাথে শুরু হয়, যখন একটি কাঠামো জনসাধারণের সাথে শুরু হয়। এটি সি এর সাথে পিছনে সামঞ্জস্য বজায় রাখা

অনুশীলনে, আমি সর্বদা ডেটা ধারক হিসাবে স্ট্রাক্ট এবং বস্তু হিসাবে শ্রেণি ব্যবহার করেছি।


4

অন্যরা যেমন উল্লেখ করেছে

  • উভয়ই ডিফল্ট দৃশ্যমানতা বাদে সমতুল্য
  • কোনও কারণেই যে কোনও কারণে এক বা অন্যটি ব্যবহার করতে বাধ্য হতে পারে

স্ট্রস্ট্রস্ট্র / সটার থেকে কোনটি কখন ব্যবহার করবেন সে সম্পর্কে একটি স্পষ্ট সুপারিশ রয়েছে:

শ্রেণীর যদি একটি আক্রমণকারী থাকে তবে ক্লাসটি ব্যবহার করুন; ডেটা সদস্যরা স্বতন্ত্রভাবে পরিবর্তিত হতে পারে যদি কাঠামো ব্যবহার করুন

যাইহোক, মনে রাখবেন যে sth ঘোষণা করার জন্য বুদ্ধিমানের কাজ নয়। শ্রেণি হিসাবে ( class X;) এবং এটি স্ট্রাক্ট ( struct X { ... }) হিসাবে সংজ্ঞায়িত করুন । এটি কিছু লিঙ্কারগুলিতে (উদাঃ, জি ++) কাজ করতে পারে এবং অন্যদের উপর যেমন ব্যর্থ হতে পারে (যেমন, এমএসভিসি), সুতরাং আপনি নিজেকে বিকাশকারী নরকে খুঁজে পাবেন।


আপনি এই লিঙ্কার সমস্যা বর্ণনা করতে পারেন?
23-30

দুর্ভাগ্যক্রমে আমি উদাহরণও কারুকাজ করতে সক্ষম নই। তুচ্ছ class Foo; struct Foo { void bar() {} }; int main() { Foo().bar(); }না শুধুমাত্র প্রনয়ন এবং MSVC 2017 সঙ্গে রান এটা এমনকি একটি পরিষ্কার বিপদসঙ্গেত যে উত্পাদন করে Fooহিসাবে মনোনীত হন structকিন্তু হিসাবে সংজ্ঞায়িত করা class। তবে আমি এটাও স্পষ্ট মনে রেখেছি যে এই নির্বোধ বাগটি খুঁজে পেতে আমাদের দলটির অর্ধদিন ব্যয় হয়েছিল। আমি নিশ্চিত নই যে আমরা তখন এমএসভিসি সংস্করণটি ব্যবহার করেছি।
পাসবি

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


ঠিক মনে নেই। সমস্যাটি সরাসরি কোনও অ্যাপ্লিকেশনটিতে দেখা দেয়নি, তবে একটি গ্রন্থাগারে যা গেষ্টে ব্যবহৃত হয়েছিল in আমি কেবল জানি যে লিঙ্কারটি বোধগম্য ত্রুটি তৈরি করেছিল (এলএনকে ???)। একবার আমি structপ্রতিমুখে class-আর- ওদিক থেকে প্রতিস্থাপন করলাম, সমস্যাগুলি চলে গেল। আজকের হিসাবে, আমি এটিও আশ্চর্যজনক মনে করি। আপনি যদি এতে কিছুটা আলোকপাত করতে পারতেন তবে আমি খুশি হব।
পাসবি

3

ক্লাস।

ক্লাসের সদস্যরা ডিফল্টরূপে ব্যক্তিগত।

class test_one {
    int main_one();
};

এর সমতুল্য

class test_one {
  private:
    int main_one();
};

সুতরাং যদি আপনি চেষ্টা করুন

int two = one.main_one();

আমরা একটি ত্রুটি পেয়ে যাব: main_one is privateকারণ এটি অ্যাক্সেসযোগ্য নয়। আমরা এটির সর্বজনীন অর্থ উল্লেখ করে এটি সূচনা করে সমাধান করতে পারি

class test_one {
  public:
    int main_one();
};

Struct।

স্ট্রাক্ট এমন একটি শ্রেণি যেখানে সদস্যরা ডিফল্টরূপে সর্বজনীন হয়।

struct test_one {
    int main_one;
};

মানে main_oneপ্রাইভেট হয়

class test_one {
  public:
    int main_one;
};

আমি ডেটা স্ট্রাকচারের জন্য স্ট্রাক্ট ব্যবহার করি যেখানে সদস্যরা যে কোনও মান নিতে পারে, সেভাবেই সহজ।


3

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

এখানে কেবল structএবং কখনই ব্যবহারের আর একটি কারণ নেই class। সি ++ এর জন্য কিছু কোড শৈলী নির্দেশিকা ফাংশন ম্যাক্রোগুলির জন্য ছোট অক্ষরগুলি ব্যবহার করার পরামর্শ দেয়, যুক্তিটি হ'ল যখন ম্যাক্রো একটি ইনলাইন ফাংশনে রূপান্তরিত হয়, নামটি পরিবর্তন করার প্রয়োজন হবে না। একই অবস্থা. আপনার সি সি স্টাইলের সুন্দর কাঠামো রয়েছে এবং একদিন আপনি খুঁজে পেতে পারেন যে আপনাকে কোনও নির্মাণকারী বা কিছু সুবিধা পদ্ধতি যুক্ত করতে হবে। আপনি এটি একটি এ পরিবর্তন করবেন class? সব জায়গা?

structএস এবং classএস এর মধ্যে পার্থক্য করা খুব বেশি ঝামেলা, আমাদের কী করা উচিত - প্রোগ্রামিংয়ের পথে প্রবেশ করা। সি +++ এর অনেকগুলি সমস্যার মতো, এটি পিছনের সামঞ্জস্যের দৃ strong় ইচ্ছা থেকেই উদ্ভূত হয়।


কেন আপনি এটিকে পরিবর্তন করতে হবে class? আপনি কী ভেবেছিলেন structকীওয়ার্ড দিয়ে সংজ্ঞায়িত শ্রেণীর সদস্য ফাংশন বা কনস্ট্রাক্টর থাকতে পারে না?
২bit

@ ধারাবাহিকতা এবং 2. এর কারণে @ লাইটনেসরেসিনঅরব্যাট কিছু স্ট্যাটিক বিশ্লেষক 1 এর লঙ্ঘন সম্পর্কে অভিযোগ করেছেন
ভোরাক

এটি অনুসরণ করে না। আপনি অন্য কোন "ধারাবাহিকতা" মেনে চলেন? যাকে ডেকে পাঠানো প্রত্যেক সদস্যের ক্লাসটি কীওয়ার্ড joe()দিয়ে সংজ্ঞায়িত করা উচিত class? কমপক্ষে 4 intসদস্য বিশিষ্ট প্রতিটি শ্রেণীর structকীওয়ার্ড দিয়ে সংজ্ঞা দেওয়া উচিত ?
অরবিতের হালকাত্বের রেস

@ লাইটনেসেসিনঅরবিট আমি এই আইডিয়ামটির কথা উল্লেখ করছি "পিওডির সমষ্টিগুলি সংজ্ঞায়িত হয় struct, পদ্ধতিগুলির সাথে সমষ্টিগুলি সংজ্ঞায়িত হয় class"। খুব ঝামেলা।
ভোরাক

2

বিভিন্ন ডিফল্টের সাথে তারা একই জিনিস (এর জন্য ডিফল্টরূপে ব্যক্তিগত classএবং এর জন্য ডিফল্টরূপে সর্বজনীন struct), তাই তত্ত্বের ক্ষেত্রে তারা সম্পূর্ণ বিনিময়যোগ্য।

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


2

ডিফল্টরূপে স্ট্রাক্টগুলিতে সর্বজনীন অ্যাক্সেস থাকে এবং ডিফল্টরূপে শ্রেণিতে ব্যক্তিগত অ্যাক্সেস থাকে।

ব্যক্তিগতভাবে আমি ডেটা ট্রান্সফার অবজেক্টস বা মান অবজেক্ট হিসাবে স্ট্রাক্ট ব্যবহার করি। যখন এই হিসাবে ব্যবহার করা হয় তখন আমি অন্যান্য সদস্যদের সংশোধন রোধ করতে সমস্ত সদস্যকে কনস্ট হিসাবে ঘোষণা করি।


2

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

তবে উভয়ের মধ্যে একটি বিশাল পার্থক্য হ'ল structএকটি কীওয়ার্ড হিসাবে সি তে সমর্থিত হয়েছে যেখানে classনেই। এর অর্থ এই যে এক একটি ব্যবহার করতে পারেন structএকটি ফাইল যে হতে পারে অন্তর্ভুক্ত #includeতাই যতদিন পারেন সি ++ বা C মধ্যে structএকটি প্লেইন সি স্টাইল structএবং অন্য সব কিছুর অন্তর্ভুক্ত ফাইল সি সঙ্গে সামঞ্জস্যপূর্ণ, অর্থাত কোন সি ++ যেমন নির্দিষ্ট কিওয়ার্ড private, publicকোন পদ্ধতি, কোন উত্তরাধিকার, ইত্যাদি। ইত্যাদি।

এসি স্টাইলটি structঅন্যান্য ইন্টারফেসের সাথে ব্যবহার করা যেতে পারে যা ইন্টারফেসের structউপরে এবং সামনে এগিয়ে যাওয়ার জন্য সি স্টাইল ব্যবহার করে সমর্থন করে ।

এসি স্টাইল structহ'ল এক ধরণের টেম্পলেট (কোনও সি ++ টেম্পলেট নয় বরং একটি প্যাটার্ন বা স্টেনসিল) যা একটি মেমরি অঞ্চলের বিন্যাস বর্ণনা করে। কয়েক বছর ধরে সি থেকে এবং সি প্লাগইনগুলির সাথে (এখানে আপনার জাভা এবং পাইথন এবং ভিজ্যুয়াল বেসিকের দিকে তাকানো) ইন্টারফেস তৈরি করা হয়েছে যার কয়েকটি সি স্টাইলের সাথে কাজ করে struct


1

প্রযুক্তিগতভাবে উভয়ই সি ++ তে একই - উদাহরণস্বরূপ কোনও কাঠামোর পক্ষে অতিরিক্ত লোড অপারেটর ইত্যাদি থাকা সম্ভব possible

যাহোক :

আমি যখন স্ট্রাক্ট ব্যবহার করি যখন আমি "ফাংশনাল" অবজেক্টের সাথে ডিল করি তখন এক সাথে আমি একাধিক ধরণের তথ্য পাস করতে চাই।

আশা করি এটা সাহায্য করবে.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

উদাহরণস্বরূপ, আমি এখানে ... () পদ্ধতিতে স্ট্রাক্ট ছাত্রকে ফিরছি - উপভোগ করুন।


1

আপনি কখন স্ট্রাকটি ব্যবহার করবেন এবং কখন সি ++ এ ক্লাস ব্যবহার করবেন?

আমি structযখন সংজ্ঞায়িত করি functorsএবং ব্যবহার করি POD। অন্যথায় আমি ব্যবহার class

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};

1
এই উত্তরটি বয়সের লক্ষণগুলি দেখায় :) std::binary_function<>কেবলমাত্র হ্রাস করা হয় না, সি ++ 17 এমনকি এটি সরিয়ে দেয়।
sehe

এটি 15 বছর আগে সংজ্ঞায়িত ভাষা সি ++ 03 এর সময়ে লেখা হয়েছিল বলে আশ্চর্য হওয়ার কিছু নেই।
26-15

1

যখন আমি পিওডি টাইপ বা ফান্টকার তৈরি করতে চাই তখন আমি স্ট্র্ট ব্যবহার করি।


1

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


0

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

উদাহরণস্বরূপ: ফাইল এবং সকেট স্ট্রিম থেকে ডেটা পড়া / লেখা ইত্যাদি a এমন কাঠামোতে ফাংশন আর্গুমেন্টগুলি পাস করা যেখানে ফাংশন আর্গুমেন্টগুলি অনেক বেশি এবং ফাংশন সিনট্যাক্সটি খুব দীর্ঘ দেখায়।

টেকনিক্যালি ডিফল্ট অ্যাক্সেসযোগ্যতা ব্যতীত শ্রেণি এবং স্ট্রিউউর মধ্যে বড় পার্থক্য নেই। আপনি এটি কীভাবে ব্যবহার করেন তা প্রোগ্রামিং স্টাইলের উপর আরও বেশি নির্ভর করে।


-4

আমি ভেবেছিলাম স্ট্রুক্টস ডেটা স্ট্রাকচার হিসাবে চিহ্নিত করা হয়েছিল (তথ্যের মাল্টি-ডেটা টাইপের অ্যারের মতো) এবং ক্লাসগুলি কোড প্যাকেজিংয়ের জন্য সূচিত হয়েছিল (সাব্রোটাইনস এবং ফাংশন সংগ্রহের মতো) ..

:(


-6

আমি সি ++ তে কখনও "স্ট্রাক্ট" ব্যবহার করি না।

আপনি ব্যক্তিগত সদস্যদের চাইলে আপনি কোনও কাঠামো ব্যবহার করবেন এমন পরিস্থিতিতে আমি কখনও কল্পনা করতে পারি না, যদি না আপনি ইচ্ছাকৃতভাবে বিভ্রান্ত হওয়ার চেষ্টা করছেন।

দেখে মনে হচ্ছে স্ট্রাক্টগুলি ব্যবহার করা ডেটা কীভাবে ব্যবহৃত হবে তার একটি সিনট্যাক্টিক ইঙ্গিতই বেশি, তবে আমি কেবল একটি ক্লাস তৈরি করে ক্লাসের নামে বা মন্তব্যের মাধ্যমে তা স্পষ্ট করার চেষ্টা করতাম।

যেমন

class PublicInputData {
    //data members
 };

আমার মতে, "ডেটা কীভাবে ব্যবহৃত হবে তার একটি সিনট্যাকটিক ইঙ্গিত" একটি স্ট্রাক্ট ব্যবহার করার জন্য পুরোপুরি ভাল কারণ, বিশেষত বিকল্পটির যদি কোনও বিকল্প বা ক্লাসের নাম ব্যবহার করা হয়।
ভিক্টর সেহর

2
structক্লাসের সদস্যরা ডিফল্টরূপে পাবলিক হবে এমনটি কি ইতিমধ্যে সুস্পষ্টভাবে ঘোষণা করে না ?
ভুল ব্যবহারকারীর নাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.