অপারেটরটি কীভাবে পোস্টফিক্স a++
এবং উপসর্গের জন্য দুটি ভিন্ন উপায়ে ওভারলোড করবেন ++a
?
অপারেটরটি কীভাবে পোস্টফিক্স a++
এবং উপসর্গের জন্য দুটি ভিন্ন উপায়ে ওভারলোড করবেন ++a
?
উত্তর:
এর মতো দেখতে হবে:
class Number
{
public:
Number& operator++ () // prefix ++
{
// Do work on this. (increment your object here)
return *this;
}
// You want to make the ++ operator work like the standard operators
// The simple way to do this is to implement postfix in terms of prefix.
//
Number operator++ (int) // postfix ++
{
Number result(*this); // make a copy for result
++(*this); // Now use the prefix version to do the work
return result; // return the copy (the old) value.
}
};
Number operator++ (int)
গ্রহণ করেন int
?
++x
প্রিফিক্স এবং এইভাবে কল operator++()
যখন x++
পোস্টসাফিক্স এবং এইভাবে কলoperator++(int)
পার্থক্যটি আপনার ওভারলোড (গুলি) এর জন্য আপনি স্বাক্ষরটি বেছে নেবেন operator ++
।
সি ++ এফএকিউ এ এই বিষয়ে সম্পর্কিত নিবন্ধ থেকে উদ্ধৃত (আরও তথ্যের জন্য সেখানে যান):
class Number { public: Number& operator++ (); // prefix ++: no parameter, returns a reference Number operator++ (int); // postfix ++: dummy parameter, returns a value };
পিএস: আমি যখন এ সম্পর্কে জানতে পেরেছিলাম, প্রথম দিকে আমি যা দেখেছি তা ডামি প্যারামিটার ছিল, তবে বিভিন্ন রিটার্নের ধরণগুলি আসলে আরও আকর্ষণীয়; তারা ব্যাখ্যা করতে পারে কেন সাধারণের++x
চেয়ে বেশি দক্ষ হিসাবে বিবেচিত হয় ।x++
আপনার কাছে টাইপ টির জন্য দুটি (উপসর্গ / পোস্টফিক্স) ++ অপারেটরগুলি ওভারলোড করার দুটি উপায় রয়েছে:
"সাধারণ" ওওপি আইডিয়ামটি ব্যবহার করে এটি সবচেয়ে সহজ উপায়।
class T
{
public :
T & operator++() // ++A
{
// Do increment of "this" value
return *this ;
}
T operator++(int) // A++
{
T temp = *this ;
// Do increment of "this" value
return temp ;
}
} ;
এটি করার আরেকটি উপায়: ফাংশনগুলি যতক্ষণ তারা খুব উল্লেখ করছে সেই বস্তুর সাথে একই নামস্থানে থাকবে, তখনই সংকলক হ্যান্ডেল ++t ;
বা t++ ;
কোডের জন্য কোনও ফন্টন অনুসন্ধান করবে তখন তাদের বিবেচনা করা হবে :
class T
{
// etc.
} ;
T & operator++(T & p_oRight) // ++A
{
// Do increment of p_oRight value
return p_oRight ;
}
T operator++(T & p_oRight, int) // A++
{
T oCopy ;
// Copy p_oRight into oCopy
// Do increment of p_oRight value
return oCopy ;
}
এটি মনে রাখা জরুরী যে, একটি সি ++ ভিউপয়েন্ট (একটি সি ++ সংকলক দৃষ্টিভঙ্গি সহ) থেকে, সেই সদস্যবিহীন ফাংশনগুলি এখনও টি এর ইন্টারফেসের অংশ (যতক্ষণ তারা একই নামস্থানে থাকে)।
সদস্যবিহীন ফাংশন স্বরলিপিটির দুটি সম্ভাব্য সুবিধা রয়েছে:
এর মতো ঘোষণা করুন:
class A
{
public:
A& operator++(); //Prefix (++a)
A operator++(int); //Postfix (a++)
};
যথাযথভাবে প্রয়োগ করুন - প্রত্যেকে যা জানেন তারা কী করে তা নিয়ে গণ্ডগোল করবেন না (বর্ধিতকরণ তারপর ব্যবহার করুন, ব্যবহার করুন তারপর ইনক্রিমেন্ট)।
আমি জানি যে দেরি হয়ে গেছে, তবে আমার একই সমস্যা ছিল এবং একটি সহজ সমাধান আমি খুঁজে পেয়েছি। আমাকে ভুল করবেন না, এটি শীর্ষ সমাধানের মতো একই সমাধান (মার্টিন ইয়র্ক পোস্ট করেছেন)। এটি কিছুটা সহজ। আর একটু. এটা এখানে:
class Number
{
public:
/*prefix*/
Number& operator++ ()
{
/*Do stuff */
return *this;
}
/*postfix*/
Number& operator++ (int)
{
++(*this); //using the prefix operator from before
return *this;
}
};
উপরের সমাধানটি কিছুটা সহজ কারণ এটি পোস্টফিক্স পদ্ধতিতে কোনও অস্থায়ী বস্তু ব্যবহার করে না।