কোন পরিস্থিতিতে সি ++ এ structবনাম ক ব্যবহার করা ভাল class?
কোন পরিস্থিতিতে সি ++ এ structবনাম ক ব্যবহার করা ভাল class?
উত্তর:
সি ++ এ classএবং এ এর মধ্যে পার্থক্য structহ'ল স্ট্রাক্টের ডিফল্ট publicসদস্য এবং ঘাঁটি থাকে এবং শ্রেণিতে ডিফল্ট privateসদস্য এবং ঘাঁটি থাকে। উভয় শ্রেণীর এবং structs মিশ্রণ থাকতে পারে public, protectedএবং privateসদস্য, উত্তরাধিকার ব্যবহার করতে পারেন ও সদস্য ফাংশন থাকতে পারে।
আমি স্ট্রাক্টগুলি কোনও শ্রেণিবদ্ধ বৈশিষ্ট্য ছাড়াই প্লেইন-পুরাতন-ডেটা স্ট্রাকচার হিসাবে ব্যবহার privateকরার এবং ডেটা এবং সদস্য ফাংশন সহ সামগ্রিক ডেটা স্ট্রাকচার হিসাবে ক্লাস ব্যবহার করার পরামর্শ দেব ।
অন্য প্রত্যেকে যেমন মন্তব্য করেছেন যে সত্যিকারের দুটি মাত্র ভাষা পার্থক্য রয়েছে:
structসর্বজনীন অ্যাক্সেস classডিফল্ট এবং ব্যক্তিগত অ্যাক্সেস ডিফল্ট।structডিফল্টে publicসম্পত্তি ও classডিফল্ট privateউত্তরাধিকার। (হাস্যকরভাবে, সি ++ এর মতো অনেকগুলি জিনিস হিসাবে, ডিফল্টটি পিছনের দিকে: publicউত্তরাধিকার অনেক বেশি সাধারণ পছন্দ, তবে লোকেরা খুব কমই কী কীওয়ার্ড structটাইপ করার সময় সংরক্ষণ করতে " public" ঘোষণা করে ।তবে অনুশীলনের আসল পার্থক্য হ'ল একটি class/ structযা একজন নির্মাতা / ডেস্ট্রাক্টর এবং যেটি দেয় না তার মধ্যে ঘোষণা করে। একটি "সাধারণ-পুরাতন-ডেটা" পিওডি টাইপের নির্দিষ্ট গ্যারান্টি রয়েছে যা আপনি ক্লাসের নির্মাণের দায়িত্ব নেওয়ার পরে আর প্রযোজ্য না। এই পার্থক্যটি পরিষ্কার রাখার জন্য, অনেক লোক ইচ্ছাকৃতভাবে কেবল structPOD টাইপগুলির জন্য এস ব্যবহার করে এবং যদি তারা কোনও পদ্ধতি যুক্ত করতে চলে তবে classএস ব্যবহার করুন । নীচের দুটি খণ্ডের মধ্যে পার্থক্য অন্যথায় অর্থহীন:
class X
{
public:
// ...
};
struct X
{
// ...
};
(প্রসঙ্গত, "পিওডি টাইপ" আসলে কী বোঝায় সে সম্পর্কে কিছু ভাল ব্যাখ্যা সহ একটি থ্রেড এখানে রয়েছে: সি ++ এ পিওডি প্রকারগুলি কী? )
structবা classনেই be সদস্য ফাংশনগুলির কোনও কোনও পিওডি হওয়ার ক্ষেত্রে কোনও প্রভাব নেই। আপনি যা লিখেছিলেন তা আমি যখন আবার পড়েছি, আমি দেখতে পাচ্ছি আপনি অন্যথায় পরামর্শ দিচ্ছেন না, তবে বর্তমান শব্দটি বিভ্রান্ত করছে
বিদ্যমান উত্তরগুলিতে প্রচুর ভুল ধারণা রয়েছে।
উভয় 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।
class foo { public: ... };এবং অন্যটিতে থাকতে পারে struct foo { ... };যা "একেবারে সমতুল্য" দাবী অনুসারে সত্য ধারণ করতে পারে। এটি অসম্পূর্ণ ঘোষণা struct foo;এবং class foo;বিনিময়যোগ্য যে কারণ আসে । এগুলি শ্রেণীর বডি নির্দিষ্ট করে না এবং তাই তারা অ্যাক্সেস লেআউটে কিছুই বলে না।
Fooএবং Barএখনও সমতুল্য / অভিন্ন ধরনের হয়। আমি নিশ্চিত বলতে "যখন করতে হয়নি redeclaring " এবং একটি উদাহরণ দিতে। এটি ভাবতে আসুন, আমি লোককে
আমি যখন ক্লাসের পরিবর্তে কোনও কাঠামো ব্যবহার করি তখনই কোনও ফাংশন কলে ব্যবহার করার আগে কোনও ফান্টারকে ডিক্লেয়ার করার সময় এবং স্পষ্টতার জন্য সিনট্যাক্স হ্রাস করতে চাই। উদাহরণ:
struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare());
থেকে সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী লাইট :
স্ট্রাক্টের সদস্য এবং বেস ক্লাসগুলি ডিফল্টরূপে সর্বজনীন হয়, শ্রেণিতে, তারা ব্যক্তিগতকে ডিফল্ট করে। দ্রষ্টব্য: আপনার ডিফল্ট উপর নির্ভর না করে আপনার বেস ক্লাসগুলি স্পষ্টভাবে সরকারী, ব্যক্তিগত বা সুরক্ষিত করা উচিত।
কাঠামো এবং শ্রেণি অন্যথায় কার্যত সমতুল্য।
ঠিক আছে, যথেষ্ট যে নির্ঘাত পরিষ্কার টেকনো টক। আবেগগতভাবে, বেশিরভাগ বিকাশকারী একটি শ্রেণি এবং কাঠামোর মধ্যে একটি দৃ strong় পার্থক্য তৈরি করে। একটি কাঠামো সহজেই বিটগুলির একটি খোলা স্তূপের মতো মনে হয় যা খুব কম এনক্যাপসুলেশন বা কার্যকারিতার পথে থাকে। একটি শ্রেণি বুদ্ধিমান পরিষেবাদি, একটি শক্তিশালী এনক্যাপসুলেশন বাধা এবং একটি ভাল সংজ্ঞায়িত ইন্টারফেস সহ সমাজের একজন জীবিত এবং দায়িত্বশীল সদস্যের মতো বোধ করে। যেহেতু বেশিরভাগ লোকের ইতিমধ্যে ধারণার মূল ধারণাটিই রয়েছে, আপনার সম্ভবত খুব কম পদ্ধতি রয়েছে এবং জনসাধারণের ডেটা রয়েছে এমন একটি ক্লাস থাকলে আপনার স্ট্রাক কীওয়ার্ডটি ব্যবহার করা উচিত (এই জাতীয় জিনিসগুলি ভাল ডিজাইন করা সিস্টেমে রয়েছে!) তবে অন্যথায় আপনার সম্ভবত ক্লাসটি ব্যবহার করা উচিত শব্দ।
স্ট্রাক্ট আমার জন্য সহায়ক হয়ে উঠেছে এমন এক জায়গা যখন আমার কাছে এমন সিস্টেম থাকে যা অন্য সিস্টেম থেকে স্থির ফর্ম্যাট বার্তাগুলি (ওভার বলে, একটি সিরিয়াল বন্দর) প্রাপ্ত করে। আপনি বাইটসের স্ট্রিমটিকে এমন একটি কাঠামোতে ফেলে দিতে পারেন যা আপনার ক্ষেত্রগুলি সংজ্ঞায়িত করে এবং তারপরে সহজে ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারে।
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);
}
স্পষ্টতই, আপনি সি তে এটি একই জিনিস করতেন তবে আমি দেখতে পেলাম যে বার্তাটি কোনও শ্রেণিতে ডিকোড করার ওভারহেডটি সাধারণত এটির পক্ষে উপযুক্ত নয়।
operator >>লেখার পরিবর্তে কোনও শ্রেণিতে প্রয়োগ করতে পেরেছিলেন processMessage, যা আপনার সি ++কে যথাযথ সি ++ এবং আরও কম সি
__packed__এবং একটি ইন্ডিয়ান-সচেতন ইফদেফ বাস্তবায়ন থাকতে হবে (আপনাকে এমন কোনও মেশিনে অর্ডারটি ফ্লিপ করতে হবে যেখানে শেষের দিকটি বাইরের তথ্য উত্সের বিপরীতে থাকে is সরবরাহ করা হয়)। এটি সুন্দর নয়, তবে আমি এম্বেড থাকা প্ল্যাটফর্মগুলিতে পোর্টেবল উপায়ে দূরবর্তী পেরিফেরিয়ালগুলির জন্য প্যাকেজ / আনপ্যাক ব্যবহার করেছি।
charটাইপ, যা এলিয়াসিং থেকে অব্যাহতিপ্রাপ্ত। যাইহোক, এখনও একটি সমস্যা আছে, যদিও একটি ভিন্ন একটি: যদিও char*ইতিমধ্যে সেই ঠিকানায় সূচিত পরবর্তীকালের কোনও অবজেক্ট যদি সত্যিই না পাওয়া যায় তবে এটি ইউবি হ'ল এটি আজীবন নিয়ম লঙ্ঘন করে। আফাইক, গন্তব্য প্রকারটি যদি তুচ্ছভাবে গঠনমূলক হয় তবে কেবলমাত্র সি ++ এর জন্য সেই স্মৃতিটিকে সেই ধরণের হিসাবে বিবেচনা করার অনুমতি দেওয়ার জন্য বরাদ্দ মেমরির পক্ষে যথেষ্ট নয়।
আপনি সি ++ তে "স্ট্রাক্ট" ব্যবহার করতে পারেন যদি আপনি এমন একটি লাইব্রেরি লিখছেন যার অভ্যন্তরীণ সি ++ রয়েছে তবে এআইপিআই কে সি বা সি ++ কোড দ্বারা কল করা যেতে পারে। আপনি কেবলমাত্র একটি একক শিরোলেখ তৈরি করেন যাতে স্ট্রাইক এবং গ্লোবাল এপিআই ফাংশন রয়েছে যা আপনি সি এবং সি ++ কোড উভয়কেই প্রকাশ করেছেন:
// 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
তারপরে আপনি সি ++ কোড ব্যবহার করে একটি সি ++ ফাইলে একটি ফাংশন বার () লিখতে পারেন এবং এটিকে সি থেকে কল করতে পারেন এবং দুটি বিশ্ব ঘোষিত স্ট্রাক্টের মাধ্যমে ডেটা ভাগ করতে পারে। সি এবং সি ++ মিশ্রণের সময় অবশ্যই অন্যান্য ক্যাভেট রয়েছে তবে এটি একটি সরল উদাহরণ।
যেমনটি প্রত্যেকটি বলে, কেবলমাত্র আসল পার্থক্য হ'ল ডিফল্ট অ্যাক্সেস। তবে আমি বিশেষত স্ট্রাক্ট ব্যবহার করি যখন আমি কোনও সাধারণ ডেটা ক্লাসের সাথে কোনও ধরণের এনক্যাপসুলেশন চাই না, এমনকি যদি আমি কিছু সহায়ক পদ্ধতি প্রয়োগ করি। উদাহরণস্বরূপ, যখন আমার এর মতো কিছু দরকার হয়:
struct myvec {
int x;
int y;
int z;
int length() {return x+y+z;}
};
আমার নিজের প্রশ্নের উত্তর দিতে (নির্লজ্জভাবে), যেমন ইতিমধ্যে উল্লিখিত রয়েছে, অ্যাক্সেস সুবিধাগুলি কেবল তাদের মধ্যেই সি ++ তে পার্থক্য।
আমি কেবল ডেটা-স্টোরেজ করার জন্য একটি কাঠামো ব্যবহারের প্রবণতা রাখি। যদি এটি ডেটার সাথে কাজ করা আরও সহজ করে তোলে তবে আমি কয়েকটি সহায়ক ফাংশন পাওয়ার অনুমতি দেব। তবে যত তাড়াতাড়ি ডেটা প্রবাহ নিয়ন্ত্রণের প্রয়োজন (যেমন অভ্যন্তরীণ অবস্থা বজায় রাখে বা সুরক্ষা দেয় এমন গেটর / সেটার) বা কোনও বড় কার্যকারিতা (মূলত আরও বস্তুর মতো) অর্জন করতে শুরু করার সাথে সাথে, এটি উন্নত যোগাযোগের উদ্দেশ্যে আরও একটি শ্রেণিতে 'আপগ্রেড' হয়ে উঠবে।
স্ট্রাক্টস ( পিওডি) , আরও সাধারণভাবে) কার্যকর হয় যখন আপনি সি ++ প্রয়োগকরণের সাথে সি-সামঞ্জস্যপূর্ণ ইন্টারফেস সরবরাহ করেন, যেহেতু তারা ভাষা সীমানা এবং লিঙ্কার ফর্ম্যাটগুলি জুড়ে বহনযোগ্য।
যদি তা আপনার কাছে উদ্বেগের বিষয় না হয় তবে আমি মনে করি যে "শ্রেণি" এর পরিবর্তে "স্ট্রাক্ট" ব্যবহারটি একটি ভাল অভিভাবক (যেমন @ জিরো সিগন্যাল উপরে বলেছেন)। স্ট্রাক্টগুলিতে আরও পূর্বাভাসযোগ্য অনুলিপি শব্দার্থবিজ্ঞান রয়েছে, সুতরাং বাহ্যিক মিডিয়ায় আপনি লিখতে বা তারের মধ্য দিয়ে প্রেরণ করতে চান এমন ডেটার জন্য এগুলি কার্যকর।
কাঠামোগুলি বিভিন্ন রূপক কর্মের জন্যও কার্যকর, যেমন বৈশিষ্ট্য টেম্পলেটগুলি যা নির্ভরশীল টাইপডাইফগুলির একগুচ্ছ প্রকাশ করে:
template <typename T> struct type_traits {
typedef T type;
typedef T::iterator_type iterator_type;
...
};
... তবে এটি কেবল স্ট্রাক্টের ডিফল্ট সুরক্ষা স্তরটি সর্বজনীন হওয়ার সুযোগ নিচ্ছে ...
সি ++ এর জন্য, স্ট্রাক্ট এবং ক্লাসগুলির মধ্যে সত্যিই খুব বেশি পার্থক্য নেই। মূল কার্যকরী পার্থক্য হ'ল কোনও কাঠামোর সদস্যরা ডিফল্টরূপে সর্বজনীন হয়, যখন তারা ক্লাসে ডিফল্টরূপে ব্যক্তিগত থাকে। অন্যথায়, যতদই ভাষা সম্পর্কিত, তারা সমান।
এটি বলেছিল, আমি সি #+ তে স্ট্রাক্ট ব্যবহার করার মতো ঝোঁক ব্যবহার করছি যেমন আমি # # তে করি, ব্রায়ান যা বলেছিল তার অনুরূপ। স্ট্রাক্টগুলি হ'ল ডেটা ধারক, যখন ক্লাসগুলি অবজেক্টগুলির জন্য ব্যবহৃত হয় যা কেবলমাত্র ধরে রাখা ছাড়াও ডেটাতে কাজ করা প্রয়োজন।
তারা প্রায় একই জিনিস। সি ++ এর যাদুটির জন্য ধন্যবাদ, একটি কাঠামো একটি শ্রেণীর মতো "নতুন" ব্যবহার করে তৈরি করা, উত্তরাধিকার ব্যবহার করতে পারে, ফাংশনগুলি ধরে রাখতে পারে
একমাত্র কার্যকরী পার্থক্য হ'ল কোনও শ্রেণীর ব্যক্তিগত অ্যাক্সেস অধিকারগুলির সাথে শুরু হয়, যখন একটি কাঠামো জনসাধারণের সাথে শুরু হয়। এটি সি এর সাথে পিছনে সামঞ্জস্য বজায় রাখা
অনুশীলনে, আমি সর্বদা ডেটা ধারক হিসাবে স্ট্রাক্ট এবং বস্তু হিসাবে শ্রেণি ব্যবহার করেছি।
অন্যরা যেমন উল্লেখ করেছে
স্ট্রস্ট্রস্ট্র / সটার থেকে কোনটি কখন ব্যবহার করবেন সে সম্পর্কে একটি স্পষ্ট সুপারিশ রয়েছে:
যাইহোক, মনে রাখবেন যে sth ঘোষণা করার জন্য বুদ্ধিমানের কাজ নয়। শ্রেণি হিসাবে ( class X;) এবং এটি স্ট্রাক্ট ( struct X { ... }) হিসাবে সংজ্ঞায়িত করুন । এটি কিছু লিঙ্কারগুলিতে (উদাঃ, জি ++) কাজ করতে পারে এবং অন্যদের উপর যেমন ব্যর্থ হতে পারে (যেমন, এমএসভিসি), সুতরাং আপনি নিজেকে বিকাশকারী নরকে খুঁজে পাবেন।
class Foo; struct Foo { void bar() {} }; int main() { Foo().bar(); }না শুধুমাত্র প্রনয়ন এবং MSVC 2017 সঙ্গে রান এটা এমনকি একটি পরিষ্কার বিপদসঙ্গেত যে উত্পাদন করে Fooহিসাবে মনোনীত হন structকিন্তু হিসাবে সংজ্ঞায়িত করা class। তবে আমি এটাও স্পষ্ট মনে রেখেছি যে এই নির্বোধ বাগটি খুঁজে পেতে আমাদের দলটির অর্ধদিন ব্যয় হয়েছিল। আমি নিশ্চিত নই যে আমরা তখন এমএসভিসি সংস্করণটি ব্যবহার করেছি।
classstruct
structপ্রতিমুখে class-আর- ওদিক থেকে প্রতিস্থাপন করলাম, সমস্যাগুলি চলে গেল। আজকের হিসাবে, আমি এটিও আশ্চর্যজনক মনে করি। আপনি যদি এতে কিছুটা আলোকপাত করতে পারতেন তবে আমি খুশি হব।
ক্লাসের সদস্যরা ডিফল্টরূপে ব্যক্তিগত।
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 test_one {
int main_one;
};
মানে main_oneপ্রাইভেট হয়
class test_one {
public:
int main_one;
};
আমি ডেটা স্ট্রাকচারের জন্য স্ট্রাক্ট ব্যবহার করি যেখানে সদস্যরা যে কোনও মান নিতে পারে, সেভাবেই সহজ।
structওভারের একটি সুবিধা classহ'ল এটি কোডের একটি লাইন সংরক্ষণ করে, যদি "প্রথম জনসাধারণের সদস্য, তারপরে ব্যক্তিগত" মেনে চলে। এই আলোকে আমি কীওয়ার্ডটি classঅকেজো বলে মনে করি।
এখানে কেবল structএবং কখনই ব্যবহারের আর একটি কারণ নেই class। সি ++ এর জন্য কিছু কোড শৈলী নির্দেশিকা ফাংশন ম্যাক্রোগুলির জন্য ছোট অক্ষরগুলি ব্যবহার করার পরামর্শ দেয়, যুক্তিটি হ'ল যখন ম্যাক্রো একটি ইনলাইন ফাংশনে রূপান্তরিত হয়, নামটি পরিবর্তন করার প্রয়োজন হবে না। একই অবস্থা. আপনার সি সি স্টাইলের সুন্দর কাঠামো রয়েছে এবং একদিন আপনি খুঁজে পেতে পারেন যে আপনাকে কোনও নির্মাণকারী বা কিছু সুবিধা পদ্ধতি যুক্ত করতে হবে। আপনি এটি একটি এ পরিবর্তন করবেন class? সব জায়গা?
structএস এবং classএস এর মধ্যে পার্থক্য করা খুব বেশি ঝামেলা, আমাদের কী করা উচিত - প্রোগ্রামিংয়ের পথে প্রবেশ করা। সি +++ এর অনেকগুলি সমস্যার মতো, এটি পিছনের সামঞ্জস্যের দৃ strong় ইচ্ছা থেকেই উদ্ভূত হয়।
class? আপনি কী ভেবেছিলেন structকীওয়ার্ড দিয়ে সংজ্ঞায়িত শ্রেণীর সদস্য ফাংশন বা কনস্ট্রাক্টর থাকতে পারে না?
joe()দিয়ে সংজ্ঞায়িত করা উচিত class? কমপক্ষে 4 intসদস্য বিশিষ্ট প্রতিটি শ্রেণীর structকীওয়ার্ড দিয়ে সংজ্ঞা দেওয়া উচিত ?
struct, পদ্ধতিগুলির সাথে সমষ্টিগুলি সংজ্ঞায়িত হয় class"। খুব ঝামেলা।
বিভিন্ন ডিফল্টের সাথে তারা একই জিনিস (এর জন্য ডিফল্টরূপে ব্যক্তিগত classএবং এর জন্য ডিফল্টরূপে সর্বজনীন struct), তাই তত্ত্বের ক্ষেত্রে তারা সম্পূর্ণ বিনিময়যোগ্য।
সুতরাং, আমি যদি কিছুটা ঘুরে দেখার জন্য কেবল কিছু তথ্য প্যাকেজ করতে চাই তবে আমি একটি স্ট্রাক্ট ব্যবহার করি, যদিও আমি সেখানে কয়েকটি পদ্ধতি রাখি (তবে অনেকগুলি নয়)। যদি এটি বেশিরভাগ ক্ষেত্রে অস্বচ্ছ জিনিস থাকে তবে মূল ব্যবহার পদ্ধতিগুলির মাধ্যমে হবে এবং সরাসরি ডেটা সদস্যদের কাছে নয়, আমি একটি পূর্ণ শ্রেণি ব্যবহার করি।
ডিফল্টরূপে স্ট্রাক্টগুলিতে সর্বজনীন অ্যাক্সেস থাকে এবং ডিফল্টরূপে শ্রেণিতে ব্যক্তিগত অ্যাক্সেস থাকে।
ব্যক্তিগতভাবে আমি ডেটা ট্রান্সফার অবজেক্টস বা মান অবজেক্ট হিসাবে স্ট্রাক্ট ব্যবহার করি। যখন এই হিসাবে ব্যবহার করা হয় তখন আমি অন্যান্য সদস্যদের সংশোধন রোধ করতে সমস্ত সদস্যকে কনস্ট হিসাবে ঘোষণা করি।
উভয় structএবং classযদিও দৃশ্যমানতা বিভিন্ন অক্ষমতা সঙ্গে ফণা অধীন একই রকম, structডিফল্ট সার্বজনিক এবং classডিফল্ট ব্যক্তিগত। হয় আপনি এক যথাযথ ব্যবহার সঙ্গে অন্যান্য হতে পরিবর্তন করতে পারেন privateএবং public। উভয়ই উত্তরাধিকার, পদ্ধতি, নির্মাতা, ধ্বংসকারী এবং কোনও অবজেক্ট ওরিয়েন্টেড ভাষার সমস্ত গুডিকে অনুমতি দেয়।
তবে উভয়ের মধ্যে একটি বিশাল পার্থক্য হ'ল structএকটি কীওয়ার্ড হিসাবে সি তে সমর্থিত হয়েছে যেখানে classনেই। এর অর্থ এই যে এক একটি ব্যবহার করতে পারেন structএকটি ফাইল যে হতে পারে অন্তর্ভুক্ত #includeতাই যতদিন পারেন সি ++ বা C মধ্যে structএকটি প্লেইন সি স্টাইল structএবং অন্য সব কিছুর অন্তর্ভুক্ত ফাইল সি সঙ্গে সামঞ্জস্যপূর্ণ, অর্থাত কোন সি ++ যেমন নির্দিষ্ট কিওয়ার্ড private, publicকোন পদ্ধতি, কোন উত্তরাধিকার, ইত্যাদি। ইত্যাদি।
এসি স্টাইলটি structঅন্যান্য ইন্টারফেসের সাথে ব্যবহার করা যেতে পারে যা ইন্টারফেসের structউপরে এবং সামনে এগিয়ে যাওয়ার জন্য সি স্টাইল ব্যবহার করে সমর্থন করে ।
এসি স্টাইল structহ'ল এক ধরণের টেম্পলেট (কোনও সি ++ টেম্পলেট নয় বরং একটি প্যাটার্ন বা স্টেনসিল) যা একটি মেমরি অঞ্চলের বিন্যাস বর্ণনা করে। কয়েক বছর ধরে সি থেকে এবং সি প্লাগইনগুলির সাথে (এখানে আপনার জাভা এবং পাইথন এবং ভিজ্যুয়াল বেসিকের দিকে তাকানো) ইন্টারফেস তৈরি করা হয়েছে যার কয়েকটি সি স্টাইলের সাথে কাজ করে struct।
প্রযুক্তিগতভাবে উভয়ই সি ++ তে একই - উদাহরণস্বরূপ কোনও কাঠামোর পক্ষে অতিরিক্ত লোড অপারেটর ইত্যাদি থাকা সম্ভব 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;
};
উদাহরণস্বরূপ, আমি এখানে ... () পদ্ধতিতে স্ট্রাক্ট ছাত্রকে ফিরছি - উপভোগ করুন।
আপনি কখন স্ট্রাকটি ব্যবহার করবেন এবং কখন সি ++ এ ক্লাস ব্যবহার করবেন?
আমি 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; }
};
std::binary_function<>কেবলমাত্র হ্রাস করা হয় না, সি ++ 17 এমনকি এটি সরিয়ে দেয়।
সমস্ত শ্রেণীর সদস্যরা ডিফল্টরূপে ব্যক্তিগত এবং সমস্ত কাঠামোর সদস্যরা ডিফল্টরূপে সর্বজনীন। শ্রেণীর ডিফল্ট বেসরকারী বেস রয়েছে এবং স্ট্রাক্টের ডিফল্ট পাবলিক বেস রয়েছে। সি এর ক্ষেত্রে স্ট্রাক্টের সদস্য ফাংশন থাকতে পারে না যেখানে সি ++ এর মতো আমরা স্ট্রাক্টে সদস্য ফাংশন যুক্ত করতে পারি। এই পার্থক্যগুলি বাদে আমি তাদের সম্পর্কে অবাক করার মতো কিছু পাই না।
আমি স্ট্রাক্ট কেবল তখনই ব্যবহার করি যখন এর সাথে সম্পর্কিত কোনও সদস্য ফাংশন ছাড়াই কিছু তথ্য রাখার প্রয়োজন হয় (সদস্যের ডেটাতে পরিচালনা করতে) এবং ডেটা ভেরিয়েবলগুলি সরাসরি অ্যাক্সেস করার জন্য।
উদাহরণস্বরূপ: ফাইল এবং সকেট স্ট্রিম থেকে ডেটা পড়া / লেখা ইত্যাদি a এমন কাঠামোতে ফাংশন আর্গুমেন্টগুলি পাস করা যেখানে ফাংশন আর্গুমেন্টগুলি অনেক বেশি এবং ফাংশন সিনট্যাক্সটি খুব দীর্ঘ দেখায়।
টেকনিক্যালি ডিফল্ট অ্যাক্সেসযোগ্যতা ব্যতীত শ্রেণি এবং স্ট্রিউউর মধ্যে বড় পার্থক্য নেই। আপনি এটি কীভাবে ব্যবহার করেন তা প্রোগ্রামিং স্টাইলের উপর আরও বেশি নির্ভর করে।
আমি ভেবেছিলাম স্ট্রুক্টস ডেটা স্ট্রাকচার হিসাবে চিহ্নিত করা হয়েছিল (তথ্যের মাল্টি-ডেটা টাইপের অ্যারের মতো) এবং ক্লাসগুলি কোড প্যাকেজিংয়ের জন্য সূচিত হয়েছিল (সাব্রোটাইনস এবং ফাংশন সংগ্রহের মতো) ..
:(
আমি সি ++ তে কখনও "স্ট্রাক্ট" ব্যবহার করি না।
আপনি ব্যক্তিগত সদস্যদের চাইলে আপনি কোনও কাঠামো ব্যবহার করবেন এমন পরিস্থিতিতে আমি কখনও কল্পনা করতে পারি না, যদি না আপনি ইচ্ছাকৃতভাবে বিভ্রান্ত হওয়ার চেষ্টা করছেন।
দেখে মনে হচ্ছে স্ট্রাক্টগুলি ব্যবহার করা ডেটা কীভাবে ব্যবহৃত হবে তার একটি সিনট্যাক্টিক ইঙ্গিতই বেশি, তবে আমি কেবল একটি ক্লাস তৈরি করে ক্লাসের নামে বা মন্তব্যের মাধ্যমে তা স্পষ্ট করার চেষ্টা করতাম।
যেমন
class PublicInputData {
//data members
};
structক্লাসের সদস্যরা ডিফল্টরূপে পাবলিক হবে এমনটি কি ইতিমধ্যে সুস্পষ্টভাবে ঘোষণা করে না ?