আমি একটি স্ট্রমে যা লেখা আছে তা নিয়ন্ত্রণ করতে চাই, যেমন coutকাস্টম শ্রেণীর কোনও বস্তুর জন্য। সি ++ এ কি সম্ভব? জাভাতে আপনি toString()একই উদ্দেশ্যে পদ্ধতিটিকে ওভাররাইড করতে পারেন ।
আমি একটি স্ট্রমে যা লেখা আছে তা নিয়ন্ত্রণ করতে চাই, যেমন coutকাস্টম শ্রেণীর কোনও বস্তুর জন্য। সি ++ এ কি সম্ভব? জাভাতে আপনি toString()একই উদ্দেশ্যে পদ্ধতিটিকে ওভাররাইড করতে পারেন ।
উত্তর:
সি ++ এ আপনি নিজের কাস্টম শ্রেণীর operator<<জন্য ওভারলোড করতে পারেন ostream:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
এইভাবে আপনি স্ট্রিমগুলিতে আপনার শ্রেণীর উদাহরণগুলি আউটপুট করতে পারেন:
A x = ...;
std::cout << x << std::endl;
আপনি যদি operator<<ক্লাসের ইন্টার্নালগুলি মুদ্রণ করতে চান Aএবং এর ব্যক্তিগত এবং সুরক্ষিত সদস্যদের সত্যিই অ্যাক্সেসের প্রয়োজন হয় তবে আপনি এটিকে বন্ধুর কার্য হিসাবেও ঘোষণা করতে পারেন:
class A {
private:
friend std::ostream& operator<<(std::ostream&, const A&);
int j;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.j << ")";
}
friend, এবং শ্রেণীর using namespaceবঙ্গের ভিতরেও - এটির সাহায্যে আপনাকে অপারেটর (এবং শ্রেণি) নামের নামের স্থানের জন্য কোনও কাজ করতে হবে না , তবে ADL সেই শ্রেণীর অবজেক্টটি এতক্ষণ খুঁজে পাবে অপারেশন এক।
dumpজনসাধারণের পদ্ধতিটি নোংরা এবং অপ্রয়োজনীয়। friendএখানে ব্যবহার পুরোপুরি ঠিক আছে। আপনি রিডানডান্ট পদ্ধতি পছন্দ করেন না বা কোনও হস্তক্ষেপ friendপুরোপুরি স্বাদের বিষয়, যদিও friendএই সঠিক উদ্দেশ্যে যুক্তিযুক্তভাবে পরিচয় করা হয়েছিল।
operator<<()সদস্য ফাংশন তৈরি করা কাজ করবে না: আপনি এটির std::ostreamবাম হাতের ক্রিয়াকলাপ গ্রহণ করার জন্য এটির সদস্য ফাংশন বানাতে হবে std::ostream।
পলিমারফিজমকে মঞ্জুরি দিয়ে আপনি এটি এভাবেও করতে পারেন:
class Base {
public:
virtual std::ostream& dump(std::ostream& o) const {
return o << "Base: " << b << "; ";
}
private:
int b;
};
class Derived : public Base {
public:
virtual std::ostream& dump(std::ostream& o) const {
return o << "Derived: " << d << "; ";
}
private:
int d;
}
std::ostream& operator<<(std::ostream& o, const Base& b) { return b.dump(o); }
toStringআচরণটি অনুলিপি করতে
সি ++ 11 এ, শেষ পর্যন্ত স্ট্যান্ডার্ডকে স্ট্যান্ডার্ড যুক্ত করা হবে।
http://en.cppreference.com/w/cpp/string/basic_string/to_string
ToString()বেস শ্রেণিতে সংজ্ঞায়িত একটি ভার্চুয়াল ফাংশন হয় এবং তাই কোনও অবজেক্টের স্ট্রিং প্রতিনিধিত্ব প্রকাশ করার মানক উপায় হিসাবে ব্যবহৃত হয়। এই ফাংশনগুলি কেবল অন্তর্নির্মিত ধরণের ক্ষেত্রে প্রযোজ্য। সি ++ এ বুদ্ধিমান উপায় কাস্টম প্রকারের জন্য অপারেটরকে ওভাররাইড করে । std::string<<
operator<<সাধারণ Stringশব্দার্থতত্ত্বের তুলনায় স্ট্যান্ডার্ড স্বাক্ষরের "কদর্যতা" আমাকে মন্তব্য করতে অনুরোধ করে, এটি to_string()কেবল "একটি দরকারী সংযোজন" নয়, তবে এটি সি ++ এ করার জন্য নতুন পছন্দসই উপায়। যদি ওপি হিসাবে, একটি শ্রেণীর একটি কাস্টম স্ট্রিং প্রতিনিধিত্ব Aপছন্দসই, কেবল যথেষ্ট পরিমাণের string to_string(A a)নীচে সংজ্ঞা লিখুন class A। এটি জাভা হিসাবে উত্তরাধিকার হিসাবে প্রচার করে, এবং জাভা হিসাবে সংহত (স্ট্রিং সংযোজন দ্বারা) একত্রিত করা যেতে পারে। toString()জাভাতে নন-ওভারডিডেন যেভাবেই সীমিত ব্যবহার।
জন যা বলেছিল তার এক্সটেনশন হিসাবে, আপনি যদি স্ট্রিংয়ের উপস্থাপনাটি বের করতে এবং এটিতে এটি সঞ্চয় করতে চান std::string:
#include <sstream>
// ...
// Suppose a class A
A a;
std::stringstream sstream;
sstream << a;
std::string s = sstream.str(); // or you could use sstream >> s but that would skip out whitespace
std::stringstream<sstream>শিরোনামে অবস্থিত ।
প্রশ্নের উত্তর দেওয়া হয়েছে। তবে আমি একটি দৃ concrete় উদাহরণ যোগ করতে চেয়েছিলাম।
class Point{
public:
Point(int theX, int theY) :x(theX), y(theY)
{}
// Print the object
friend ostream& operator <<(ostream& outputStream, const Point& p);
private:
int x;
int y;
};
ostream& operator <<(ostream& outputStream, const Point& p){
int posX = p.x;
int posY = p.y;
outputStream << "x="<<posX<<","<<"y="<<posY;
return outputStream;
}
এই উদাহরণটির জন্য অপারেটর বোঝা বোঝা দরকার।