আপনি যদি operator<<
সদস্য ফাংশন হিসাবে সংজ্ঞায়িত হন তবে এটিতে আপনি কোনও সদস্যবিহীন ব্যবহার করেছেন তার চেয়ে আলাদা পচানো বাক্য গঠন থাকবে operator<<
। একটি অ-সদস্য operator<<
হ'ল একটি বাইনারি অপারেটর, যেখানে সদস্যটি operator<<
অ্যানারি অপারেটর।
struct MyObj;
std::ostream& operator<<(std::ostream& os, const MyObj& myObj);
struct MyObj
{
MyObj& operator<<(std::ostream& os) { os << *this; return *this; }
int value = 8;
};
std::ostream& operator<<(std::ostream& os, const MyObj& myObj)
{
return os << myObj.value;
}
সুতরাং .... আপনি কীভাবে তাদের কল করবেন? অপারেটররা কিছু উপায়ে অদ্ভুত, আমি আপনাকে চ্যালেঞ্জ operator<<(...)
জানাব যাতে জিনিসগুলি বোধগম্য করতে আপনার মাথায় সিনট্যাক্স লিখবেন ।
MyObj mo;
mo << std::cout;
mo.operator<<(std::cout);
অথবা আপনি সদস্যবিহীন বাইনারি অপারেটরকে কল করার চেষ্টা করতে পারেন:
MyObj mo;
std::cout << mo;
operator<<(std::cout, mo);
এই অপারেটরগুলিকে সদস্য ফাংশনে পরিণত করার সময় স্বজ্ঞাতভাবে আচরণ করার আপনার কোনও বাধ্যবাধকতা নেই, আপনি চাইলে operator<<(int)
বাম শিফ্টের কিছু সদস্য পরিবর্তনশীলকে সংজ্ঞায়িত করতে পারেন, বুঝতে পারেন লোকেরা কিছুটা রক্ষী হতে পারে, আপনি যত মন্তব্যই করুক না কেন লিখুন।
প্রায় শেষ পর্যন্ত, অনেক সময় অপারেটর কলের জন্য উভয় পচন বৈধ হয়ে থাকতে পারে, আপনি এখানে সমস্যার মধ্যে পড়তে পারেন এবং আমরা সেই কথোপকথনটি পিছিয়ে দেব।
অবশেষে, খেয়াল করুন যে বাইনারি অপারেটরের মতো দেখতে এমন একটি অ্যানারি সদস্য অপারেটর লেখার পক্ষে কতটা অদ্ভুত বিষয় হতে পারে (যেমন আপনি সদস্য অপারেটরগুলিকে ভার্চুয়াল করতে পারেন ..... এছাড়াও এই পথটি বিভ্রান্ত না করে চালানোর চেষ্টা করছেন .... )
struct MyObj
{
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
এই বাক্য গঠনটি এখন অনেক কোডারকে বিরক্ত করবে ...
MyObj mo;
mo << std::cout << "Words words words";
mo.operator<<(std::cout) << "Words words words";
operator<<(mo.operator<<(std::cout), "Words words words");
cout
এখানে চেইনে দ্বিতীয় যুক্তিটি কীভাবে তা খেয়াল করুন .... বিজোড় ঠিক আছে?