خرابی: خلاصہ کلاس کو انسٹینٹیٹ نہیں کیا جا سکتا

Khraby Khlas Klas Kw Ans Yn Y N Y Kya Ja Skta



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

نحو

ہماری غلطی کا پیغام درج ذیل ہے:

غلطی : متغیر کو '' تجریدی قسم کا '' قرار نہیں دے سکتا

نوٹ کریں کہ خالی قوسین میں، متغیر اور تجریدی کلاس کے نام ہوں گے۔







غلطی C2259 : 'حالت' : تجریدی کلاس کو فوری نہیں کیا جا سکتا

یہ ایک اور پیغام ہے جو ہمیں کمپائلر سے ملتا ہے جب ہمیں اس طرح کی غلطی کا سامنا کرنا پڑتا ہے۔



مثال نمبر 01:

اس غلطی کو قابل فہم بنانے کے لیے، ہم ایک مثال پیش کریں گے جس میں ہم اپنے کوڈ کو اس طرح لکھیں گے کہ ہمیں غلطی ہو جائے۔ اس مقصد کے لیے، ہم نے 'ShapeClass' کے نام سے ایک کلاس شروع کی ہے۔ اس کلاس کو خلاصہ بنانے کے لیے، ہم نے اس میں 'getArea' کے نام سے ایک ورچوئل فنکشن کا اعلان کیا ہے۔ ہم نے بالترتیب 'setWidth' اور 'setHeight' کے ناموں کے ساتھ ساتھ دو دیگر فنکشنز کا بھی اعلان کیا ہے۔ ہم یہاں کیا کرنا چاہتے ہیں کہ ہم اونچائی کو پیرامیٹر کے طور پر اور چوڑائی کو ان پٹ پیرامیٹر کے طور پر حاصل کرنا چاہتے ہیں۔ ہم اپنے ان پٹ پیرامیٹرز کی مدد سے علاقے کا حساب لگائیں گے۔ ہم نے مرکزی طریقہ میں اپنی کلاس کی ایک مثال بنائی ہے۔ اس آبجیکٹ کی مدد سے، ہم نے طریقوں کو کال کیا ہے اور ہم ان طریقوں کے ذریعے ان پٹ پیرامیٹرز کو پاس کریں گے۔ اس کے بعد، ہم نے نتائج کو چیک کرنے کے لیے اپنا آؤٹ پٹ پرنٹ کیا۔



# شامل کریں

نام کی جگہ کا استعمال کرتے ہوئے std ;
کلاس شیپ کلاس
{
عوام :
مجازی int گیٹیریا ( ) = 0 ;
باطل سیٹ چوڑائی ( int میں )
{
چوڑائی = میں ;
}
باطل سیٹ اونچائی ( int h )
{
اونچائی = h ;
}
محفوظ :
int چوڑائی ;
int اونچائی ;
} ;
int مرکزی ( باطل )
{
ShapeClasssh ;
ایسیچ. سیٹ چوڑائی ( 1 ) ;
ایسیچ. سیٹ اونچائی ( دو ) ;
cout << 'کل مستطیل علاقہ:' << ایسیچ. گیٹیریا ( ) << endl ;
واپسی 0 ;
}

ہمارے کوڈ پر عمل درآمد کے بعد سسٹم نے ہمیں ایک غلطی دی۔ ایرر میسج کہتا ہے کہ ہم متغیر 'sh' کو خلاصہ قسم کے 'shapeclass' قرار نہیں دے سکتے۔ اب، مرتب کرنے والا یہ بتانے کی کوشش کر رہا ہے کہ 'ShapeClass' ایک تجریدی قسم ہے اور ہم اس کے متغیر کا اعلان نہیں کر سکتے۔ لہذا، پیغام کے ساتھ، ہم واضح طور پر سمجھ سکتے ہیں کہ کمپائلر ہمیں اپنی تجریدی کلاس کو فوری طور پر پیش کرنے نہیں دے رہا ہے اسی وجہ سے سسٹم ہمیں غلطی دے رہا ہے۔





خرابی کو دور کرنے کے لیے، ہم نے ایک اور کلاس 'ریکٹانگل' کا اعلان کیا۔ یہ کلاس ہماری تجریدی کلاس کی چائلڈ کلاس ہوگی اور ہم اس کلاس میں اپنے ورچوئل فنکشن کی باڈی کا اعلان کریں گے۔ اس کے بعد ہم اس کی آبجیکٹ کو مین میتھڈ میں بنائیں گے اور اس کی آبجیکٹ کی مدد سے فنکشنز کو کال کریں گے۔



ترامیم کے بعد ہم نے اپنا کوڈ بنایا اور اب ہم اپنا کوڈ چلانے میں کامیاب ہو گئے ہیں۔ سسٹم نے ہمارے کوڈ کو غلطیاں دیے بغیر عمل میں لایا ہے۔ ہم آؤٹ پٹ میں دیکھ سکتے ہیں کہ سسٹم نے مستطیل کے رقبہ کا حساب لگایا ہے اور آؤٹ پٹ پرنٹ کیا ہے۔ ہم نے سیکھا ہے کہ ہماری غلطی یہ تھی کہ ہم براہ راست اپنی تجریدی کلاس کے اعتراض کو بلا رہے تھے جو کہ غلط نقطہ نظر تھا۔ جب ہم نے اس کے چائلڈ کلاس کے آبجیکٹ کو بلایا تو ہمارا کوڈ ٹھیک کام کرنے لگا۔

مثال نمبر 02:

اس مثال میں، ہم کوئی ریاضیاتی حساب نہیں کر رہے ہوں گے۔ یہ مثال ایک عام مثال ہے جو ہمیں تجریدی کلاسوں کو سمجھنے میں مدد کرے گی اور کوڈ پر عمل کرتے وقت کمپائلر طریقوں اور کلاسوں کے درمیان کیسے چلتا ہے۔ اس کلاس میں، ہم نے ایک تجریدی کلاس بنائی ہے اور اسے 'AbsClass' کا نام دیا ہے۔ ہم نے ایک اور کلاس کو 'چائلڈ کلاس' قرار دیا ہے لیکن یہ کوئی خلاصہ کلاس نہیں ہے۔ یہ کلاس ہماری تجریدی کلاس سے ماخوذ ہے۔

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

# شامل کریں

نام کی جگہ کا استعمال کرتے ہوئے std ;
کلاس AbsClass
{
عوام :
مجازی int VirtFunc ( ) = 0 ;
باطل ویلیو فنک ( int میں )
{
چوڑائی = میں ;
cout << 'آبجیکٹ کا استعمال کرتے ہوئے قدر پاس کی گئی' << میں << endl ;
}
محفوظ :
int چوڑائی ;
} ;
کلاس چائلڈ کلاس :
عوامی AbsClass
{
عوام :
int VirtFunc ( ) {
cout << 'ورچوئل فنکشن میں' << endl ;
}
} ;
int مرکزی ( باطل )
{
چائلڈ کلاس سی سی ;
سی سی ویلیو فنک ( 5 ) ;
cout << سی سی VirtFunc ( ) << endl ;
واپسی 0 ;
}

ہمارے کوڈ پر عمل درآمد کے بعد، ہمیں ایک غلطی ملے گی۔ یہ خامی بنیادی طور پر یہ ہے کہ ہم ایک تجریدی کلاس کو انسٹینٹیٹ نہیں کر سکتے جسے ہم یہاں اپنے مرکزی طریقہ کار میں کرنے کی کوشش کر رہے ہیں۔ یہاں ایک بات قابل غور ہے کہ ہمارے پیغام میں متغیر اور تجریدی قسم کو تبدیل کر دیا گیا ہے۔

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

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

نتیجہ

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