সি ++ জাভা এর টসস্ট্রিং সমতুল্য?


151

আমি একটি স্ট্রমে যা লেখা আছে তা নিয়ন্ত্রণ করতে চাই, যেমন coutকাস্টম শ্রেণীর কোনও বস্তুর জন্য। সি ++ এ কি সম্ভব? জাভাতে আপনি toString()একই উদ্দেশ্যে পদ্ধতিটিকে ওভাররাইড করতে পারেন ।

উত্তর:


176

সি ++ এ আপনি নিজের কাস্টম শ্রেণীর 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 << ")";
}

16
অপারেটরটিকে << ক্লাসের ফ্রেন্ড ফাংশন হিসাবে ঘোষণা করা ভাল কারণ এটি ক্লাসের ব্যক্তিগত সদস্যদের অ্যাক্সেস করার প্রয়োজন হতে পারে।
নবীন

5
এটি আরও ভাল হিসাবে এখনও ঘোষণা করুন friend, এবং শ্রেণীর using namespaceবঙ্গের ভিতরেও - এটির সাহায্যে আপনাকে অপারেটর (এবং শ্রেণি) নামের নামের স্থানের জন্য কোনও কাজ করতে হবে না , তবে ADL সেই শ্রেণীর অবজেক্টটি এতক্ষণ খুঁজে পাবে অপারেশন এক।
পাভেল মিনায়েভ

... উপরোক্ত বলতে " শ্রেণীর দেহের অভ্যন্তরে তাকে বন্ধু হিসাবে সংজ্ঞায়িত করা " বলতে চেয়েছিল - যেমন একটি ইনলাইন সদস্য সংজ্ঞা ছিল।
পাভেল মিনায়েভ

2
@ ফ্যানিয়েটো: dumpজনসাধারণের পদ্ধতিটি নোংরা এবং অপ্রয়োজনীয়। friendএখানে ব্যবহার পুরোপুরি ঠিক আছে। আপনি রিডানডান্ট পদ্ধতি পছন্দ করেন না বা কোনও হস্তক্ষেপ friendপুরোপুরি স্বাদের বিষয়, যদিও friendএই সঠিক উদ্দেশ্যে যুক্তিযুক্তভাবে পরিচয় করা হয়েছিল।
কনরাড রুডলফ

1
@ পাভেল: যতক্ষণ না অপারেটর শ্রেণীর হিসাবে একই নামস্থানে সংজ্ঞায়িত হয় ততক্ষণ আর্গুমেন্ট নির্ভর লুকআপ এটি খুঁজে পেতে পারে। বন্ধুদের সাথে এটির কোনও সম্পর্ক নেই এবং শ্রেণীর অভ্যন্তরে এটি ঘোষিত / সংজ্ঞায়িত করার প্রয়োজন নেই। এছাড়াও, operator<<()সদস্য ফাংশন তৈরি করা কাজ করবে না: আপনি এটির std::ostreamবাম হাতের ক্রিয়াকলাপ গ্রহণ করার জন্য এটির সদস্য ফাংশন বানাতে হবে std::ostream
sth

50

পলিমারফিজমকে মঞ্জুরি দিয়ে আপনি এটি এভাবেও করতে পারেন:

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); }

3
ভার্চুয়াল ফাংশনটির জন্য জাভা এর toStringআচরণটি অনুলিপি করতে
কনরাড রুডল্ফ

ক্লাসে << ক্লাসে সরাসরি অপারেটর নির্দিষ্ট করার চেয়ে বোবা কেন?
ভিক্ষু

1
কারণ আপনি একটি অসীম লুপ এবং ক্র্যাশ করতে চান না
ফিনিটো - ফার্নান্দো নিটো

1
কী এই সিরিয়ালাইজ করতে হবে তার বিকল্পগুলি পাস করার জন্য সম্ভবত এই কৌশলটি দ্রুত এবং সহজ। অন্যথায় এটি অন্য শ্রেণীর বন্ধুবান্ধব অপারেটরকে সংজ্ঞায়িত করতে হবে << যা ক্রমিককরণের জন্য বিকল্পগুলি এবং ডেটা দিয়ে শুরু করা হয়েছে।
স্যামুয়েল ড্যানিয়েলসন

আরেকটি বিষয় হ'ল ডাম্প কার্যকারিতা বাস্তবায়ন একটি ইন্টারফেস দ্বারা প্রয়োগ করা যেতে পারে, যা প্রস্তাবিত অপারেটরটি ব্যবহার করা সম্ভব হবে না।
jupp0r

29

সি ++ 11 এ, শেষ পর্যন্ত স্ট্যান্ডার্ডকে স্ট্যান্ডার্ড যুক্ত করা হবে।

http://en.cppreference.com/w/cpp/string/basic_string/to_string


15
এটি এই পৃষ্ঠায় একটি দরকারী সংযোজন, তবে সি ++ বাস্তবায়ন জাভা / সি # এর তুলনায় উল্লেখযোগ্যভাবে পৃথক। এই ভাষাগুলিতে, সমস্ত বস্তুর ToString()বেস শ্রেণিতে সংজ্ঞায়িত একটি ভার্চুয়াল ফাংশন হয় এবং তাই কোনও অবজেক্টের স্ট্রিং প্রতিনিধিত্ব প্রকাশ করার মানক উপায় হিসাবে ব্যবহৃত হয়। এই ফাংশনগুলি কেবল অন্তর্নির্মিত ধরণের ক্ষেত্রে প্রযোজ্য। সি ++ এ বুদ্ধিমান উপায় কাস্টম প্রকারের জন্য অপারেটরকে ওভাররাইড করে । std::string<<
ড্রু নোকস

9
জাভা operator<<সাধারণ Stringশব্দার্থতত্ত্বের তুলনায় স্ট্যান্ডার্ড স্বাক্ষরের "কদর্যতা" আমাকে মন্তব্য করতে অনুরোধ করে, এটি to_string()কেবল "একটি দরকারী সংযোজন" নয়, তবে এটি সি ++ এ করার জন্য নতুন পছন্দসই উপায়। যদি ওপি হিসাবে, একটি শ্রেণীর একটি কাস্টম স্ট্রিং প্রতিনিধিত্ব Aপছন্দসই, কেবল যথেষ্ট পরিমাণের string to_string(A a)নীচে সংজ্ঞা লিখুন class A। এটি জাভা হিসাবে উত্তরাধিকার হিসাবে প্রচার করে, এবং জাভা হিসাবে সংহত (স্ট্রিং সংযোজন দ্বারা) একত্রিত করা যেতে পারে। toString()জাভাতে নন-ওভারডিডেন যেভাবেই সীমিত ব্যবহার।
পি মেরেকি

10

জন যা বলেছিল তার এক্সটেনশন হিসাবে, আপনি যদি স্ট্রিংয়ের উপস্থাপনাটি বের করতে এবং এটিতে এটি সঞ্চয় করতে চান 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>শিরোনামে অবস্থিত ।


2
সিরিয়ালাইজেশন স্ট্রিংটি পাওয়ার জন্য এটি একটি হাস্যকর জটিল উপায়!
গার্ড ওয়াগনার

9

প্রশ্নের উত্তর দেওয়া হয়েছে। তবে আমি একটি দৃ 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;
}

এই উদাহরণটির জন্য অপারেটর বোঝা বোঝা দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.