যদি সম্ভব হয় তবে অ-সদস্য এবং অ-বন্ধু ফাংশন হিসাবে।
হার্ব সাটার এবং স্কট মায়ারস বর্ণনা অনুসারে, এনক্যাপসুলেশন বাড়াতে সহায়তার জন্য সদস্য ফাংশনগুলির তুলনায় অ-বন্ধু নন-সদস্য ফাংশনটিকে পছন্দ করুন।
কিছু ক্ষেত্রে, যেমন সি ++ স্ট্রিমগুলির মতো আপনার পছন্দ নেই এবং অবশ্যই সদস্যবিহীন ফাংশন ব্যবহার করতে হবে।
তবে তবুও, এর অর্থ এই নয় যে আপনাকে এই ফাংশনগুলি আপনার ক্লাসের বন্ধু বানিয়ে তুলতে হবে: এই ফাংশনগুলি এখনও আপনার ক্লাস অ্যাক্সেসরগুলির মাধ্যমে আপনার ক্লাসে প্রবেশ করতে পারে। আপনি যদি এইভাবে এই ফাংশনগুলি লিখতে সফল হন তবে আপনি জিতেছেন।
অপারেটর << এবং >> প্রোটোটাইপ সম্পর্কে
আমি বিশ্বাস করি আপনি আপনার প্রশ্নে যে উদাহরণ দিয়েছেন তা ভুল are উদাহরণ স্বরূপ;
ostream & operator<<(ostream &os) {
return os << paragraph;
}
এমনকি এই পদ্ধতিটি কোনও স্ট্রিমে কীভাবে কাজ করতে পারে তা আমি ভাবতেও শুরু করতে পারি না।
<< এবং >> অপারেটরগুলি প্রয়োগ করার জন্য এখানে দুটি উপায়।
ধরা যাক আপনি টি টাইপের স্ট্রিমের মতো অবজেক্টটি ব্যবহার করতে চান Let's
এবং আপনি যে অনুচ্ছেদে টাইপের আপনার অবজেক্টের প্রাসঙ্গিক ডেটা / টি থেকে / সন্নিবেশ করতে চান।
জেনেরিক অপারেটর << এবং >> ফাংশন প্রোটোটাইপস
প্রথম কাজ হিসাবে:
// T << Paragraph
T & operator << (T & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// T >> Paragraph
T & operator >> (T & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return p_oInputStream ;
}
জেনেরিক অপারেটর << এবং >> পদ্ধতি প্রোটোটাইপ
দ্বিতীয়টি পদ্ধতি হিসাবে:
// T << Paragraph
T & T::operator << (const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return *this ;
}
// T >> Paragraph
T & T::operator >> (const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return *this ;
}
দ্রষ্টব্য যে এই স্বরলিপিটি ব্যবহার করার জন্য, আপনাকে অবশ্যই টি এর শ্রেণির ঘোষণাটি প্রসারিত করতে হবে। এসটিএল অবজেক্টের জন্য, এটি সম্ভব নয় (আপনার এগুলি সংশোধন করার কথা নয় ...)।
এবং টি যদি একটি সি ++ স্ট্রিম হয়?
C ++ স্ট্রীমের জন্য একই << এবং >> অপারেটরগুলির প্রোটোটাইপগুলি এখানে রয়েছে।
জেনেরিক বেসিক_লিস্টিমে এবং বেসিক_স্ট্রিমে
নোটটি হ'ল স্ট্রিমের ক্ষেত্রে যেমন আপনি সি ++ স্ট্রিমটি পরিবর্তন করতে পারবেন না, আপনাকে অবশ্যই ফাংশনগুলি বাস্তবায়ন করতে হবে। যার অর্থ এরকম কিছু:
// OUTPUT << Paragraph
template <typename charT, typename traits>
std::basic_ostream<charT,traits> & operator << (std::basic_ostream<charT,traits> & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> Paragraph
template <typename charT, typename traits>
std::basic_istream<charT,traits> & operator >> (std::basic_istream<charT,traits> & p_oInputStream, const CMyObject & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
চর istream এবং অস্ট্রিমের জন্য
নিম্নলিখিত কোডটি কেবল চর-ভিত্তিক স্ট্রিমগুলির জন্য কাজ করবে।
// OUTPUT << A
std::ostream & operator << (std::ostream & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> A
std::istream & operator >> (std::istream & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
চর-ভিত্তিক কোডটি এটির উপরে জেনেরিক কোডের একটি "বিশেষীকরণ" হলেও এই বিষয়ে মন্তব্য করেন রাইস ইউরিচ। অবশ্যই, রাইস ঠিক: আমি চর-ভিত্তিক উদাহরণ ব্যবহারের প্রস্তাব দিই না। এটি কেবল এখানে দেওয়া হয়েছে কারণ এটি পড়া সহজ। যেহেতু এটি কেবলমাত্র কার্যকর যদি আপনি কেবল চর-ভিত্তিক স্ট্রিমগুলির সাথে কাজ করেন, আপনার প্ল্যাটফর্মগুলিতে এড়ানো উচিত যেখানে ডাব্লুচার_টি কোডটি সাধারণ (যেমন উইন্ডোজে)।
আশা করি এটি সাহায্য করবে।