C++ خرابی: کوئی قابل عمل اوورلوڈ نہیں '=':

C Khraby Kwyy Qabl Ml Awwrlw N Y



خرابیاں وہ کارروائیاں ہیں جو کسی کوڈ کے غیر معمولی کام کا نتیجہ ہو سکتی ہیں۔ لکھنے کے وقت غلطی کا پتہ نہیں چل سکتا جب تک کہ ہم کوڈ پر عمل درآمد نہیں کر لیتے یا اسے مرتب نہیں کر لیا جاتا۔ کچھ غلطیاں کوڈ کو اس وقت تک عمل کرنے سے روکتی ہیں جب تک کہ انہیں ہٹا دیا نہ جائے۔ آج، ہم ایک ایسی غلطی پر بھی بات کریں گے جو پروگرام کے مرتب ہونے پر بھی ہوتی ہے، وہ ہے 'خرابی: 'آپریٹر=' کے لیے کوئی مماثلت نہیں ہے۔ یہ خرابی ان وجوہات کی وجہ سے ہو سکتی ہے جیسے: اگر ہم نے پوائنٹر کو پاس کر لیا ہے جہاں سٹرنگ کو پاس کرنا ہے، مستقل متغیر کو تبدیل کرنا، وغیرہ۔ 'کوئی قابل عمل اوور لوڈڈ' غلطی کو دور کرنا مشکل نہیں ہے لیکن بنیادی کام یہ ہے کہ غلطی کو سمجھیں کیونکہ یہ صرف غلطی کی کسی وضاحت کے بغیر غلطی کو ظاہر کرتا ہے۔

نحو

اس خرابی کے لیے اس طرح کا کوئی پہلے سے طے شدہ نحو نہیں ہے کیونکہ یہ کوڈ یا آؤٹ پٹ کا حصہ نہیں ہے یہ صرف ایک ابہام ہے جو غلط کوڈ کی وجہ سے ہو سکتا ہے۔ جیسا کہ ہم دیکھ سکتے ہیں، ذیل میں ایک مثال دی گئی ہے کہ غلطی کیسی نظر آتی ہے۔







غلطی : کوئی میچ نہیں کے لیے 'آپریٹر = '

مثال نمبر 01:

آئیے اس غلطی اور اس کو حل کرنے کے طریقہ کار کے بارے میں ایک خیال رکھتے ہیں۔ اسے بہتر طور پر سمجھنے کے لیے، ہم ایک مثال پیش کریں گے جس میں ہم آبجیکٹ کا استعمال کرتے ہوئے ناموں کو فنکشن میں منتقل کرنے جا رہے ہیں اور یہ انہیں دکھائے گا۔ ہم سب سے پہلے ہیڈر فائل iostream شامل کریں گے۔ اس کے بعد، ہم 'my_object' کے نام سے ایک کلاس کا اعلان کریں گے۔ جس کے اندر، ہم نے 'F_name' اور 'L_name' کے نام سے دو سٹرنگ متغیرات کا اعلان کیا ہے، 'F_name' جو اس شخص کے پہلے نام کی نشاندہی کرتا ہے جہاں 'L_name' شخص کے آخری نام کی نشاندہی کرتا ہے۔



اس کے بعد، ہم نے 'my_object()' کے نام سے ایک پبلک کنسٹرکٹر کا اعلان کیا ہے جس میں ہم نے 'F_name' اور 'L_name' دونوں متغیرات کو null ویلیوز تفویض کی ہیں۔ اس کے بعد، ہم نے ایک اور فنکشن کا اعلان کیا جس میں ہم نے سٹرنگ ٹائپ ویریبلز 'fn' اور 'ln' کو پاس کیا ہے۔ اس کے اندر، ہم نے name_set() طریقہ کہا۔ پھر، ہم نے دو ممبر فنکشنز 'شو()' اور 'name_set()' کا اعلان کیا۔ جب 'show() فنکشن کو بلایا جاتا ہے، تو یہ پہلے نام اور آخری نام ایک ساتھ دکھائے گا۔ جبکہ 'set_name()' ممبر فنکشن میں، ہم نے سٹرنگ ٹائپ 'fn' اور 'ln' کے دو سٹرنگ ویری ایبل پاس کیے جو ہم نے دوسرے کنسٹرکٹر کو بھی پاس کیے ہیں۔



اب، کلاس my_object کے کاپی اسائنمنٹ آپریٹر کا استعمال کرتے ہوئے، ہم 'my_object' قسم کا ایک پیرامیٹر لیتے ہیں۔ کمپائلر اسے ہمیشہ کسی بھی کلاس کے ان لائن پبلک ممبر کے طور پر اعلان کرتا ہے۔ اس ممبر کے اندر، ہم نے 'F_name' کو src.F_name اور 'L_name' کو src.L_name تفویض کیا ہے کہ ہم نے 'F_name' اور 'L_name' کی کاپی اپنے پاس رکھی ہے۔ یہ کلاس my_object کے ممبروں کو دیا جاتا ہے۔ اب، ہم نے کلاس my_cobject کے ایک آبجیکٹ کا اعلان کیا ہے جس کا نام 'name1' ہے جس پر ہم نے دلیل کے طور پر دو تار 'Ana' اور 'smith' کو پاس کیا۔ یہ کنسٹرکٹر کو کال کرے گا اور آخری نام کے ساتھ پہلا نام ظاہر کرے گا۔





اس کے بعد، ہم نے ایک اور آبجیکٹ 'name2' بنایا اور پھر اس آبجیکٹ کو الگ سے نام تفویض کیا۔ دونوں آبجیکٹ کے کنسٹرکٹر کو ویلیو پاس کرنے کے بعد، ہم نے show() طریقہ کہا جو پھر دونوں آبجیکٹ 'nam1' اور 'name2' کے نام ظاہر کرے گا۔ کوڈ کے اختتام پر، ہم نے null ویلیو واپس کر دی اور اپنے کوڈ پر عمل درآمد کیا۔

شامل
کلاس میرا_آبجیکٹ {
نجی :
std :: تار F_name، L_name ;
عوام :
میرا_آبجیکٹ ( ) { F_name = ' ; L_name = ' ; }
میرا_آبجیکٹ ( std :: تار fn، std :: تار ln ) {
name_set ( fn، ln ) ;
}
باطل دکھائیں ( ) { std :: cout << 'نام ہے' << F_name << ' << L_name << ' \n ' ; }
باطل name_set ( std :: تار fn، std :: تار ln ) { F_name = fn ; L_name = ln ; }
میرا_آبجیکٹ اور آپریٹر = ( const میرا_آبجیکٹ اور src ) {
F_name = src F_name ;
L_name = src L_name ;
واپسی * یہ ;
}

} ;
int مرکزی ( int argc چار ** argv ) {
my_object name1 ( 'انا' , 'سمتھ' ) ;
my_object name2 ;
name2 = ( 'انا' , 'سمتھ' ) ;
نام 1۔ دکھائیں ( ) ;
name2. دکھائیں ( ) ;
واپسی 0 ;
}

ہمارے کوڈ پر عمل درآمد کے بعد، ہمارے پاس یہ ایرر ہے جو ظاہر کرتا ہے کہ ہم نے لائن 24 پر غلط کوڈ لکھا ہے جو اس غلطی کی قسم کو ظاہر کرتا ہے جس کا سامنا ہوا ہے 'خرابی: 'آپریٹر=' کے لیے کوئی مماثلت نہیں ہے۔ اب ہم اس غلطی کو دور کرنے کی کوشش کریں گے۔



اس خرابی کو حل کرنے کے لیے، ہمارے پاس قدروں کو کسی بھی کلاس کے کنسٹرکٹر کو منتقل کرنے کے متعدد طریقے ہیں۔ پہلے طریقہ میں، ہم صرف 'name1' آبجیکٹ کو 'name2' کو تفویض کریں گے کیونکہ ہم نے دونوں آبجیکٹ کو ایک جیسی قدریں دی ہیں اس لیے انہیں الگ سے پاس کرنے کی ضرورت نہیں ہے۔ اب ہم کوڈ پر عمل کرتے ہیں۔

int مرکزی ( int argc چار ** argv ) {

my_object name1 ( 'انا' , 'سمتھ' ) ;
my_object name2 ;
name2 = نام 1 ;
نام 1۔ دکھائیں ( ) ;
name2. دکھائیں ( ) ;

کوڈ میں تبدیلیاں کرنے کے بعد جیسا کہ اوپر دکھایا گیا ہے، ہمارے پاس نتیجہ ذیل کے ٹکڑوں میں دیا گیا ہے۔ ہم نے ظاہر کیا ہے کہ کنسٹرکٹر کو پاس کیا گیا نام بغیر کسی غلطی کے کامیابی کے ساتھ دکھایا گیا ہے۔

اس خرابی کو حل کرنے کا دوسرا طریقہ یہ ہے کہ جب ہمیں دونوں اشیاء کو مختلف قدریں منتقل کرنی ہوں گی۔ ہم صرف کلاس کا نام ان اقدار کے ساتھ استعمال کریں گے جو کنسٹرکٹر کو دلیل کے طور پر منتقل کرنا ہیں۔ ہم نے پہلا نام 'جھون' اور دوسرا نام 'سمتھ' پاس کیا۔ پھر، ہم نے کوڈ پر عمل درآمد کیا۔

int مرکزی ( int argc چار ** argv ) {

my_object name1 ( 'انا' , 'سمتھ' ) ;
my_object name2 ;
name2 = میرا_آبجیکٹ ( 'جان'، 'سمتھ' ) ;

نام 1۔ دکھائیں ( ) ;
name2. دکھائیں ( ) ;

مندرجہ بالا شامل کردہ کوڈ پر عمل کرنے کے بعد، ہمارے پاس آؤٹ پٹ ہے جیسا کہ نیچے دکھایا گیا ہے۔ آبجیکٹ 'name1' کے لیے، اس نے 'Ana smith' کا نام ظاہر کیا اور دوسرے آبجیکٹ 'name2' کے لیے اس نے 'Jhone Smith' ظاہر کیا۔ لیکن اس بار ہمارے کوڈ نے بغیر کسی غلطی کے ٹھیک سے کام کیا۔

اب، ہم اپنے کوڈ کو کامیابی سے چلانے کے لیے ایک اور طریقہ آزمائیں گے۔ جیسا کہ مندرجہ بالا معاملات میں، ہم نے اسائنمنٹ آپریٹر کا استعمال کرتے ہوئے آبجیکٹ کو قدریں تفویض کرنے کی کوشش کی۔ لیکن اس بار، ہم اعتراض کے اعلان کے وقت اقدار کو پاس کریں گے۔ جیسا کہ ہم ذیل کے ٹکڑوں میں دیکھ سکتے ہیں، کسی آبجیکٹ 'name1' کے اعلان کے وقت، ہم نے 'name2' کے لیے ایک ہی قدم کو دہرانے والی آبجیکٹ کے لیے دلیل کے طور پر اقدار کو پاس کیا۔ اب، ہم ایک بار پھر کوڈ پر عمل کرتے ہیں۔

int مرکزی ( int argc چار ** argv ) {
my_object name1 ( 'انا' , 'سمتھ' ) ;
my_object name2 ( 'جان'، 'سمتھ' ) ;
نام 1۔ دکھائیں ( ) ;
name2. دکھائیں ( ) ;

اس بار بھی کوڈ کے عمل میں آنے کے بعد، ہمیں کسی غلطی کا سامنا نہیں کرنا پڑا جس کا مطلب ہے کہ یہ ہمیں کسی قسم کی غلطیوں سے بھی روکے گا۔

نتیجہ

ہم نے مختصراً ایک ایسی خرابی پر تبادلہ خیال کیا ہے جس کا سامنا ہمیں کلاسوں سے حاصل کیے جانے والے فنکشنز پر کام کرتے ہوئے ہو سکتا ہے۔ ہم نے غلطی کو حل کرنے کے اسباب اور طریقوں کا بھی مطالعہ کیا ہے 'کوئی قابل عمل اوورلوڈ نہیں'۔ زیادہ تر اس غلطی کو نئے پروگرامرز کے لیے سمجھنا مشکل ہوتا ہے اس لیے ہم نے ان کے لیے مثالوں کو لاگو کرکے اور اس کی وضاحت کے ساتھ اس سے چھٹکارا حاصل کرنے کی کوشش کی۔