 اسلام علیکم This is lecture 29 of CS201 Introduction to Programming آج ہمارے لیکچر ایک انترسٹنگ طوپکے اوپر ہے وہ طوپک ہے دوستی Friendship Let's try to see کہ یہ Friendship کا جو ہے concept یہ ہمارے object based programming جو ہم کر رہے ہیں classes and objects اس کے ساتھ اس کا کیا تعلق ہے دیکھیں ہم نے class کو define کیا تھا as a user defined data type اور اس کے اندر ہم نے بات کی تھی کہ ہمیں encapsulation کی ایک facility ملتی ہے دیتا کو ہم ایک جگہ پیک اٹھا کر لیتے ہیں اور اس کے ساتھ ہم کچھ functions define کرتے ہیں جو کہ دیتا کو manipulate کر سکیں ساتھ ہم نے دو لفظ استعمال کیے تھے keywords private اور public اور کہا تھا کہ جی private keyword کے بعد جتنی چیزیں آتی ہیں class کے اندر usually وہ data members ہوتے ہیں وہ class کے اندر اندر ہی نظر آتے ہیں نظر نہیں آسکتے اور جو public keyword کے بعد جیزیں ہوتی ہیں usually وہ member functions ہوتے ہیں یا methods ہوتے ہیں وہ ہے class کا public interface اس کے ساتھ بہر سے آپ manipulate کر سکتے ہیں class کو یا اس کے objects کو اور جو public interface ہے یعنی جو member functions ہیں وہ class کے private data کو بھی access کر سکتے ہیں لیکن بہر سے آپ درکی private data کو access نہیں کر سکتے یہ جو concept ہے data encapsulation کا اور data hiding کا یہ ہماری software engineering کے لیے بہت ہی important concept ہے because یہ جیسے میں پہلے بھی ذکر کیا تھا it allows us to separate the interface from the implementation of the class which means ہم نے کس طرح کام کیا ہے وہ ہم چھپا سکتے ہیں اور کیا کرنا ہے وہ صرف دکھا سکتے ہیں so it's a separation of implementation and interface and it is critically important for large and complex programs جو آج کل ہم design کرتے ہیں systems لیکن کبھی نہ کبھی کوئی اسی ضرورت پیش آ جاتی ہے کہ بہر سے ہم private data members کو بھی manipulate کر سکی let us see اسی situation کب آتی ہے پہلے تو دا وہی دوستی کی بات کر لیں کہ friendship کا concept ہے کیا what you see here is my public interface کہ آپ کو میرے تصویی نظر آتی ہے میری آواز سنای دیتی ہے and that is all that you know of me what I'm thinking inside what is in my heart you do not know that is private that is private to me I can have access to my thoughts and my feelings but you do not have access to that کیا آپ کے کوئی ایسا اور ہومن بین ہے who has access to your private thoughts and feelings اور آپ کی کتی ہے اس ہومن بین کو ہم کیا کہتے ہیں اس کو ہم usually دوست کہتے ہیں کہ عام دنیا جو ہے وہ تو ہمیں دیکھتی اور سنتی ہے لیکن اس کے ہمارے اندر والے خیالات کا کوئی پتہ نہیں ہوتا لیکن دوستوں کا ایک ایسا تعلق ہوتا ہے ایک ایسا رشتہ ہوتا ہے کہ وہ ایک دوسر کے بھید بھی جانتے ہیں so friends have access to the inside to the inner thoughts of another friend or inner knowledge of a friend that is the definition that we use ایسی دیفنیشن ہمارے ہاں یہاں پے کلاسیز اور آبجیکس میں کوئی ہو سکتی ہے the nice thing is کہ نہ صرف ہو سکتی ہے بلکہ اس کا نام بھی friend ہی ہے so we can define friend functions of a class and these functions have access to the private data members of a class that is the good part there is a downside to all of this ایک vulnerability آجاتی ہے you are opening yourself up your thoughts, your ideas, your knowledge is now available to somebody outside of you so unless you absolutely 100% trust the outsider you normally do not make your innermost thoughts and feelings public یہی problem ہمارے ساتھ یہاں پے آتا ہے کہ where as there are situations where we want کہ جو private data ہے وہ بہر سے manipulate ہو سکے لیکن ہم اس کو in general open نہیں کرتے otherwise تو پھر data encapsulation اور hiding کا پورا concept ہی ختم ہو جائے تو ہم اس کو پھر بھی private truck تے ہیں لیکن چند specific functions ہم ایسے دیکلیر کر دیتے ہیں جو کہ کلاس کے members نہیں ہوتے they are not members of the class but they are friends of the class as friends they have access to the inside data structure but they are not members how do we declare them let us take a look to declare a friend function of a class you can put it anywhere inside the class دیکھیں friend کی ہم نے definition جو دی ہے friend function کی وہ یہ ہے کہ جی اس کو access ہے class کے private data structure کے اوپر اور اگر کوئی آپ نے utility functions بھی لکھیں میں ان کو private کیا ہوا ہے تو friend function کو وہ utility functions بھی نظر آئیں گے لہذا friend جو ہے آپ اس کو پوچھ رہے ہوں گے اگر class میں ڈالنا ہے تو اس کو private میں ڈالنا چاہیے یا public میں ڈالنا چاہیے کہہاں لکھا جائے آنسر is کہ friend is a very strong statement it is so strong in fact that it is not affected by the private and the public keywords جو ہم class کے اندر استعمال کرتے ہیں friend آپ کہیں پے بھی لکھ سکتے ہیں لیکن یہ یاد رہے کہ friend function جو ہے وہ class کا member نہیں ہے لہذا اس کی definition تو classے بہر ہی ہوگی class کے اندر صرف اس کا نام بتایا جائے گا اور اس کا prototype in a way لکھا جائے گا اور طریقہ جو ہے وہ یہ ہے کہ وہ function prototype لکھنے سے پہلے in front of it we write the keyword friend اگر ہمارے پاس کوئی class ہے ہماری class تھی date اور میں اس کے اوپر کوئی friend function دیکلیر کرنا چاہتا ہوں تو date کے اندر class کی definition کے اندر میں کہیں پے بھی لکھ دوں گا friend آگے میں اپنا function name لکھوں گا اور function name کے بعد parenthesis کے اندر جو بھی اس کے arguments ہیں وہ لکھ دوں گا now if you think about it friend function کو class کے اندر تک پہنچنے کے لیے کوئی object چاہیے ہوگا of that class تو usually وہ friend function کے جو parameter list ہے اس کے اندر آپ کو اسی class تیپ کا ایک object بھی دینا پڑے گا normally that is what you will see with friend functions اب پھر وہی بات آجاتی ہے styles کی کہ جی style کیا ہے لکھنے کا میں نے پہلے ارس کیا کہ friend function جو ہے وہ private اور public key word سے affect نہیں ہوتا اس کو class کی definition کے اندر آپ کہیں پے بھی لکھ سکتے ہیں ایک طریقہ تو یہ ہے کہ اس کو public interface کے ساتھ شامل کر لیا جائے کہ یہ چیز بہر سے نظر آتی ہے لیکن اس کا اس definition کے ساتھ کوئی تعلق نہیں بناتا کیونکہ friend functions تو ویسے ہی بہتے ہوئے ہیں وہ class کا حصہ ہی نہیں so you normally or actually programmers normally write friend functions right at the top class کی definition جہاں شروع ہوئی تو پہلے سارے friends declare کیے اس کے بعد private data آگیا اس کے بعد public data آگیا it's just a guideline it's a matter for you to develop your own style and see کہ اگر آپ کو friend functions کی ضرورت پڑتی ہے تو ان کو class کی definition کی اندر کہاں لکھنا لکھنا ہے یہ class کی ہم normally header file بناتے ہیں کیونکہ implementation ہم separate کرنا چاہ رہے ہیں تو class کے جو member functions ہیں وہ کہیں اور لکھے جاتے ہیں اور ان کو compile کر کے ہم ایک object file بناتے رکھ چھوڑتے ہیں یہ جو class کی definition کی میں بات کر رہا ہوں یہ وہ ہے جو class کی header file ہے اور header file کے اندر ہم یہ friends declare کرتے ہیں پھر چلتے ہیں واپس friendship اور دوستی کی definition کی بارے میں دیکھیں I can declare you to be my friend which means اگر میں نے کہا دیا کہ جی آپ میرے دوست ہیں تو میں نے آپ کو اپنے بھید اپنے راز اپنے اندر کے شیالات بتانے شروع کر دیے now it need not work both ways اس کا یہ مطلب نہیں ہے کہ آپ نے بھی کہا دیا کہ ہاں تو میرے دوست ہو so friendship is granted it is never taken اس چیز کا خاص کیال رکھنا ہے ایک class جو ہے وہ اپنے لیے friends declare کرتی ہے بہر سے بیٹھ کے اپنے آپ کو کوئی friend بنا نہیں سکتا class کا یہ concept بھی important ہے کیونکہ اس کو سوچے ذرا اگر بہر سے بیٹھ کے کوئی function declare کر سکتا اس کا دوست ہوں I'm a friend function of this class then by definition that external function would have access to the private data members of the class but that in a way negates the whole concept of encapsulation and data hiding تو ہم یہ سارہ لٹرم پترم کر رہے ہیں کہ جی class is or objects or private or public keywords لگا رہے ہیں اور data کو چھپا رہے ہیں and along a function comes along کسی over programmer کا لکھا میں آپ نے آپ کو اس کلاس کا friend declare کرتا ہوں and now I can go inside and do whatever I want doesn't work that way the class has to declare itself کہ جی Flana function جو ہے وہ میرا دوست ہے so the class declare's friend functions they cannot be declared from outside please keep that very very clear and that makes a lot of sense کہ آپ نے class لکھی آپ نے اس کی definition لکھی آپ نے ہی declare کرنا ہے کہ جناب اس کلاس کے friend functions کون کون سے ہو سکتے ہیں once that is done and the class is compiled اب کوئی بہر سے لا کے اپنا function وہاں پہ نہیں لگا سکتا کہ یہ function بھی اس کلاس کا friend ہے بہر والے functions کو اس کلاس کا normal public interface ہی نظر آئے گا جو پھر آپ نے ہی declare کیا تھا so keep that in mind just to recap and summarize this concept friend functions are not members of the class the class itself declares کہ جی میرے friend functions کون کون سے ہیں class کی definition کی اندر ان friend functions کی prototype دی جاتی ہے اور ان سے پہلے friend کا key word لکھا جاتا ہے f r i e n d اور prototype جب میں نے کہا دیا تو اس کا مطلب ہے اس کی پوری argument list بھی دی جاتی ہے these functions have access to the private data members which really means they have access to everything inside the class normally in functions کو ہم کوئی نا کوئی object of the class بھی pass کر رہے ہوتے in the argument list تاکہ وہ class کے اندر کسی object کی data کو manipulate کر سکیں اس کے بعد style کی بات آجاتی ہے style کی جہاں تک بات ہے تو ہم normally class کی جہاں پر definition شروع کرتے ہیں وہی پہ سارے friend functions پہلے declare کر دیتے ہیں because of the class اس کے بعد private data آجاتا ہے یا utility functions آجاتے ہیں اور پھر public interface آجاتا ہے which are normally functions ہاں چلتے چلتے یہ میں بات کرتا چلنو کہ آپ نوٹس کریں گے کہ public interface of the class وہ usually اس کے اندر صرف اور صرف functions پڑے ہوتے ہیں methods پڑے ہوتے ہیں by which we manipulate the class this is quite normal usually public interface میں ہم data کوئی نہیں رکتے because of the classes کہ انکا interface you have is method 1 method 2 method 3 and so on nothing else now let us take a look at some very simple examples of friend functions let us start with this first example جہاں پہ ہم نے ایک class declare کی ہے اور اس کا ایک private data member ہے which is an integer ساتھ ہم نے ایک friend function declare کر دیا ہے جو کہ اس class کے ایک کسم کا object you have to accept کرتا ہے as a parameter so let us call that friend function increment اور یہ کرے گا کیا کہ اس class کا جو integer private data member ہے اس کی value کو بڑھا دے گا it will increment it suppose ہم اس کو دو arguments دے دیتے ہیں ہم کہتے ہیں ایک تو ہم object دیں گے جس کے integer value کو increment کرنا ہے اور ایک integer دے دیں گے کتنے سے increment کرنا ہے کتنے سے اس value کو بڑھانا ہے جو private data member ہے just to exemplify اس کا نام ہم نے رکھتی ہے top secret ہماری class جو ہے let us call it my class or call it whatever you want اس کا private data member ہے int top secret public interface کچھ بھی ہو ساتھ ہم نے ایک friend function declare کر دیا ہے friend increment اور پھر ہماری my class کا object آئے گا private class comma int اور یہ int وہ ہوگا جو کہ top secret کو increment کرے گا ساتھ ہم اس کا ایک لکھ دیتے ہیں let's say constructor اور constructor میں ہم کر دیتے ہیں کہ جس top secret کو جب object create ہو اس کو کوئی value دے دی جائے suppose ہم اس کو value 100 دے دیتے ہیں ایک کوئی public function لکھلے interface کے لیے تاکہ وہ class کی value print بھی کر سکیں تو ہم ایک public interface دے دیتے ہیں display function جو see out کے ذریعے top secret کی value کو screen پرنٹ کر دیتا ہے اب چلتے ہیں friend function جو ہے increment اس کی طرف class کی definition کمپریٹ ہو گئی اتنا چھوٹا سا function ہے display کا کہ اس کو آپ بھی چکھ ان لائن ہی لکھ دے class کی definition کے اندر بہر لکھنے کی ضرورت نہیں ہے friend function classے بہر لکھا جاتا ہے it's an ordinary function جب increment function ہم لکھ رہے ہیں اس وقت اس کے ساتھ کوئی friend کا key word نہیں جارہا because that would not know کہ کس چیز کی friend کی بات ہوری ہے میں نے پہلے ذکر کیا کہ class نے declare کر دیا ہے کہ جی میرا دوست کون ہے that is it the class declare the friends from outside we do not declare friends so our function which is increment returns nothing so it will be a void function so we say void increment اور پھر اس کے جو parameters ہے وہاں پہ ہم لکھتے ہیں my class a i.e. a is an object of type my class comma int i where i is an integer جسے ہم top secret کو increment کریں گے parenthesis ختم کر کے اب increment کی definition آگئے اس کے braces کے اندر ہم لکھتے ہیں a.top secret اب a.top secret کیا ہے وہ object a جو my class type کا object ہے اس کا جو data member ہے called top secret اس کو ہم نپلیٹ کر دے لگے ایک لائن ہے a.top secret plus equal to i plus equal to means a.top secret equals a.top secret plus i یہ تو آپ کو یاد ہوگا c سے اور یہ function یہاں ختم ہو جاتا ہے اب اگر ہم main لکھنے چلیں تو ہم main کے اندر اپنا ایک object ڈیکلیر کرتے ہیں my class x ہم نام بدل رہے ہیں just to exemplify کہ جو function تھا اس نے تو آپ نے parameter list میں جو نام ہے اس کو اندر نپلیٹ کرنا ہے call کیا جارہ ہے کچھ بھی ہو سکتا ہے ہم نے کہا my class x جیسے ہی لائن execute ہوگی کیا ہوگا if you remember whenever an object is created its constructor is called so یہ لائن جب ہمارے program میں execute ہوگی my class x تو x کے لیے a constructor call ہو جائے گا ایک object جو ہے وہ memory میں create ہوگا کی جگے بنیں گی اس کے functions کی ایک copy بنیں گی اس کے data member کی ایک copy بنیں گی members کی اگر زیادہ ہیں in this case top secret eight integer ہے جگے بن گی memory کی اندر اور پھر constructor نے کہا top secret کو value دے دو 100 تو اس نے top secret کو value دے دی 100 or object x create ہوگیا so x اگر ہم اس وقت x.display کہیں so main میں next line ہم کہہ دیتے ہیں x.display اس نے اس کا member function call کیا which is public so call ہو سکتا ہے اور وہ screen پہ دکھا دے گا the value of top secret is 100 that was the initializing value next line پہ ہم increment function call کر لیتے ہیں اب ہم کہتے ہیں اب یہ main کی اندر لکھا جا رہا ہے increment parenthesis کی اندر ہم کہتے ہیں x جو x object ہے اس کے top secret کو ہم increment کرنا چاہ رہے ہیں ہم کہتے ہیں increment x comma 10 parenthesis is closed and پھر ہم کہتے ہیں x.display اب اگر آپ دیکھیں گے تو وہ کہے گا the value of top secret is 110 that means top secret جو کہ private data member تھا اس object کا اس کو increment function نے change کر دیا ہے or increment function جو ہے وہ class کا member function نہیں ہے it is an ordinary function sitting outside the class but the class itself declared it to be a friend so now a friend function has access to the private data members or those top secret کی value بدل سکتا ہے a very simple example but you can try it yourself آپ نے لیے بیشاک ایک increment to function بھی لکھلیں جو یہی کام کرنے کی کوشش کرے لیکن class my class جو ہے وہ اس کو as a friend declare نہ کرے you will notice it does not work normally the compiler will catch that کہ جی a non friend function is trying to manipulate a private data member of the class private data members are hidden to the outside world and a non friend function constitutes the outside world let's take a look at a slightly bigger example now suppose that we have two classes my class one my class two اور دونوں میں ہم نے وہی ایک integer data member رکھا ہوا ہے اور وہ private ہے اور وہ اس کا نام وہی رہنے دیتے ہیں top secret اب ہم کرنا کیا چاہرے ہیں کہ جی دونوں کلاسز جو ہے ایک my class one ہے ایک my class two ہے ان کے top secret کو اپس میں add کر کے اس کی value دکھائے جائے دونوں میں جو top secret data members ہیں they are private ایک کلاس کو دوسی کلاس کے اندر دیکھنے کی جازت نہیں ہے so my class one and my class two are two separate classes what we need is a function sitting outside جو کہ ایک کلاس کے اندر بھی دیکھ سکے اور دوسی کلاس کے اندر بھی دیکھ سکے in this situation let us call that function add both so add both function جو ہے وہ my class one کے top secret کو my class two کے top secret کے ساتھ add کرے گا اور پھر اس کو screen پے display کر دے گا دونوں کو لے دا لے دا دکھا کے پھر ان کے سم کو display کرے گا we need a function that can look inside both classes in other words a function جو کہ دونوں کلاس کا friend ہو i mentioned earlier the classes have to declare the function as a friend so now let us take a look at the definition of my class one so we say class my class one چیلیں ہم اپنا ہی rule توڑ دیتے ہم کہتے ہیں private int top secret اوپر لکھتیہ public let's say display nothing else اب آگے باری friend function لکھنے کی میں لکھنا کیا چاہتا ہوں friend add both class one comma class two یعنی my class one comma my class two یہ میں لکھنا چاہتا ہوں can i write it notice let us now stop here for a moment and look at this one line saying friend add both my class one comma my class two یہ پروٹو تائیپ ہے یہاں پے variable names دینے کی ضرورت نہیں ہے question یہ ہے کہ یہ لائیں یہاں پے لکھی جا سکتی ہے یا نہیں ابھی تک آپ کو شاہد experience ہو گیا ہو کہ اگر آپ program کے اندر ایک function لکھتے ہیں یا function کو refer کرتے ہیں آپ نے main program کے اندر جلتے جلتے آپ نے کہ f of x اگر تو main سے پہلے defined ہے تو یہ program compile ہو جائے گا اگر وہ main سے پہلے defined نہیں ہے تو compiler error دے دے گا کہ function f unknown اور اس کو وزرنے کے لیے اس problem سے ہم مطلب solve کرنے کے لیے ہم کرتے کیا تھے کہ main سے پہلے f کا proto تائیپ کم از کم دے دیں کہ جی یہ چیز کیا ہے کہ arguments ہوں گے وہ اوپر proto تائیپ دے دی پھر main لکھ لیا پھر main کے بعد ہم بیشاک f کی definition دے دیں so there was a declaration of the function before it was named now let's get back to our problem problem exactly وہی ہے میں لکھنے لگا ہوں class my class one اور اس کے اندر میں as a friend function ڈیکلیر کرنا چاہ رہا ہوں friend add both my class one comma my class two have you seen where the problem is problem ہے کہ جی my class one تو ٹھیک ہے وہ تو یہی کلاسے جو ہم define کر رہے ہیں لیکن ابھی تک ہمارے code کو یا ہمارے program کو یا اس کلاس کو my class two کا کچھ پتہ نہیں اس کو نہیں پتہا کہ جی my class two کیا چیز ہے integer ہے double ہے class ہے what is it is it a function اس چیز کو اس چیز سے بچنے کے لیے the work around یہ ہے کہ جس طرح ہم function کا proto تائیپ اوپر دے دیتے ہیں یا function کی declaration دے دیتے ہیں main سے پہلے اس class کی definition سے پہلے ہم simple ایک line لکھ دیتے ہیں class my class two what it does is یہ دیکلیر کر دیتا ہے باقی code کی لیے کہ جناب my class two جو ہے وہ بھی ایک class ہے کہاں ہے وہ بات میں آئے گی but it's just a declaration that my class two is a class once we've done that we can refer to my class two within the code that follows so getting over this problem now let's complete the definition of my class one it's a very simple class says class my class one one private data member called int top secret ایک public function called display جو see out سے top secret کی value display کر دیتا ہے ایک constructor جو کہ top secret کو کوئی value assign کر دیتا ہے let's say 100 اور پھر ایک friend function saying add both my class one my class two اور my both at both کے بارے میں میں نے پہلے کرا تھا کہ وہ کرے گا کیا یہ my class one کی definition ختم ہو گئی my class two up define کرنے چاہیے very similar essentially identical ہم کہہتے ہیں class my class two اور پھر اس کا private data member جو ہے وہ int top secret جولتونار س rains chore جولت جولت جولت اللیک بچروہ لے اس کا بھی ایک کنسٹر دال دیں لیکن کنسٹر جو ہے وہ میکلاس 2 کے top secret کو value دے رہا ہے 200 تو when an object is created it will have a value 200 for its private data member called top secret اور اس کے بعد پھر ہم declare کریں گے friend add both my class 1 my class 2 یہاں پہ وہ مسئلہ آئے گا کہ جی میکلاس 1 کا پتہ ہے کہ نہیں پھر اب میکلاس 1 تو اوپر پوری declare ہو چکی وہ declare ہو چکی ہے تو my class 2 کو پتہ ہے my class 1 کیا چیز ہے no problem here so only the first time when you're declaring something that refers to something which is not yet defined وہاں پہ اوپر آپ کو وہ لائن دال نہیں پڑتی ہے class my class 2 so my class 1 اور my class 2 کی definition ختم ہوئی اس کے آپ نے جو میمبر functions ہے وہ لکھ لیں دو دو لائنوں کے functions ہیں now we go to our main function مین function میں پہلے ہم ایک object create کرتے ہیں of my class 1 so we say my class 1 a جیسے ہی علیاء ان execution ہوئی ایک ایک object memory میں initialized ہو گیا اور a dot top secret کو value 100 assign ہو گئی اس کے بعد next line پہ ہم ایک نیا object create کرتے ہیں ہم کہتے ہیں my class 2 b سو بی is now an object of type my class 2 again memory area is reserved for it اس کا اپنا دیتہ میمبر جو ہے which is top secret اس کے لیے جگہ ریزرب ہوئی or top secret you have will initialize ہو گیا to value 200 now we go and say a dot display اس نے see out کے through بتا دیا کے the value of top secret is 100 we go and say b dot display پر اسکرین پہ آگیا the value of top secret is 200 اس کے بعد ہم کہتے ہیں add both پر انتیسیز میں a comma b that is how we call that function add both جب آپ نے call کیا تو what is happening is at both has been declared as a friend function of both of these classes it is a friend of my class 1 and it is a friend of my class 2 لہذا add both کو my class 1 کے object کا جو top secret ڈیتہ میمبر ہے اس کو بھی access ہے or my class 2 کا جو integer top secret ڈیتہ میمبر ہے اس کو بھی access ہے if we look at the definition of add both what does it look like at both looks very simple it says see out the value of top secret in the first object یا آپ لکھ لے value of top secret in my class 1 object is اور آگے a dot top secret سبہلی چیز صرف اس لین کو execute کرنے کے لیے add both had to be a friend function because otherwise a dot top secret اس کو accessible نہ ہوتا next line ہم کہتے ہیں see out کے ساتھ b dot top secret کی line display کر دیتے ہیں اور تیسری لین پہ ہم کہتے ہیں the sum of the top secret values in my class 1 and my class 2 is او پھر less than less than a dot top secret plus b dot top secret so here we have an interesting function that can look inside two separate classes بہار سے بیٹ کے it is not a member function of either class but it has been defined and declared as a friend function of both classes just to recap the classes have defined and declared this function add both to be a friend in each class ہم نے اس کو as a friend declare کیا ہے بہار سے بیٹ کے یہ function اپنے آپ کو friend declare نہیں کر سکتا for these classes so be aware of that rule a class declare its friends friends do not become friends by saying for sitting outside and saying کہ میں تمہارا دوستوں okay so it works that way now اسی ایک سامپل کو لے کے we can expand it a little bit we can define subtract both sub both یا مل both یا ڈیف both اور اسی طریقے سے ہم چار پانچ function ڈیفائن کر دیتے ہیں ان کو friends بنا دیتے ہیں اور وہ friends جو ہیں friend functions جو ہیں وہ کلاس اس کے اندر ڈیٹا میمبر کو مینے پلیٹ کر سکتے ہیں نن دلیس friendship is not something to be used very often or without a thought one has to think clearly about it but let me go on with the usage of the friend keyword and see what else we can do with it ابھی تک ہم نے declare کیا کہ ایک کلاس جو ہے اپنے لیے کچھ friends declare کر سکتی ہے and those friends happen to be functions can two classes be friends of one another answer is yes you can declare one class to be a friend of another class in that case ایک کلاس کے functions جو ہیں ان کو complete access ہو جاتا ہے دوسی کلاس کے اندر کے ڈیٹا میمبر and functions کو so it is an interesting expansion of the definition کہ صرف function ہی نہیں ایک کلاس دوسی کلاس کی دوست ہو سکتی ہے what is the syntax for doing that all you need to do is within the class definition جو ہیڈر فائل ہے اس کی اس کے اندر ہم لکتے تھے ہیں friend other class now let's let's take a look at that specific example now we are talking of class one ایک کھماری کلاس ہوگی اور ادھر کلاس جو ہے وہ دوسی کلاس ہوگی جس کو ہم دوست بنانا چاہتے ہیں so class one کی definition کی اندر ہم کہتے ہیں class class one پھر جو بھی اس کا private ڈیٹا ہے جو بھی اس کا public interface ہے وہ define کر دیا ابھی میں functions your friends وگیرا جو ہے وہ نیچے لکھ رہا ہوں but normally میں نے کہا سٹائل میں وہ اوپر آ جاتے ہیں یہاں پہاکے ہم جیسے ہم نے friend function کی لائن لکھی تھی یہاں پہ ہم لکتے تھے ہیں friend other class اب یہاں پہ کوئی پرانثیز کچھ نہیں آ رہا یہ سمطی کہہ رہا ہے کہ other class جو ہے is now a friend of class one again the rule ادھر کلاس کا تو بھی کچھ پتا نہیں ہے کہ وہ چیز کیا ہے لہذا اس کی ہیڈر فائل میں سب سے اوپر کلاس کی definition سے بہر آپ کہ دیتے ہیں class other class یہ نہیں ہے just a line saying other class is a class اور پھر آپ اس کی جو اپنی کلاس کی definition ہے اس کے اندر اس کو friend declare کر دیتے ہیں یہ لائن جو ہے یہ کیا کرے گی this line says other class is my friend if other class is the friend of class one then other class کے سارے functions جو ہیں they have access to all the inside part of class one یعنی ادھر کلاس کے functions جو ہیں وہ class one کے data members کو بھی access کر سکتے ہیں اور class one کے data or member functions یعنی methods ان کو بھی access کر سکتے ہیں methods اگر تو وہ public تھے تو پھر تو کوئی statement نہ ہوئی وہ تو کوئی بھی access کر سکتا ہے لیکن data members جو ہیں وہ ہیں private friend class جو ہے وہ دوسی کلاس کے private data members کو access کر سکتی ہے لیکن اب اس کے ساتھ جو ہمیں خیال رکھنا ہے وہ کن چیزوں کا ہے وہ یہ ہے class one نے declare کیا کہ other class میری دوست ہے it doesn't work the other way it doesn't mean کہ class one now has access to the inside of other class یہ exactly وہی چیز ہے جو میں نے پہلے کہا تھا کہ function بہر سے بیٹھ کے اپنے آپ کو دوسی کلاس کا friend declare نہیں کر سکتا class کو declare کرنا ہے کہ جی میرے دوست کون کون ہے so ہماری class one نے declare کیا کہ other class جو ہے وہ میری friend ہے اور یہ کہنے سے ہم نے class one جو ہے اس نے اپنے آپ کو کھول دیا اور کہا کہ جی now other class can look inside and look at my private data members as well as methods functions utility functions whatever they can do whatever we want other class can now manipulate anything inside class one یہ جو میں نے statement کہی ہے کہ جی اس سے class one کو کوئی right نہیں ملتے so اگر آپ right کے حوالے سے سوچیں class جو ہے وہ اپنے اوپر دوسروں کو right دیتی ہے کوئی بھی function یا class اپنے طور پہ دوسروں کے rights حاصل نہیں کر سکتا a function cannot achieve or attain rights from the other class rights have to be granted so keep that in mind so now we have a one way relationship other class can look inside my class but my class cannot look inside other class if we wanted a two way relationship جیسے ہم نے add بوث میں کیا تھا other class would have to declare class one as a friend class پھر it's a complete two way relationship اب یہاں پہ ہم نے ساری چیزیں جو ہے نا وہ negate کر کے پھیک دی ہے کیا چیز we were trying to say کہ جی دیتہ and capsulation دیتہ hiding وہ بہت اچھی چیز ہے اور یہاں پہ ہم نے friends declare کر کے ساری دیتہ hiding جو ہے نا ختم کر دی پورا internal structure دکھا دیا friend کو اچھی بات یہ ہے کہ کلاس نے خود declare کیا کون کون friend ہے باقی لوگ اندر پھر بھی داخل نہیں ہو سکتے نقصان یہ ہے کہ اب اگر دو کلاس اس کو آپ نے اس طرح سے friendship کے ایک رشتے کے اندر جوڑ دیا تو یہ کلاس اس essentially a pair میں چلیں گی why because دیکھیں we go back to that concept of separating the interface and the implementation اگر کلاس one کی implementation باتل جائے جی دی ہم نے اس کے جو private data structure تھا اس کو بدل دیا ہم نے کہا آج کے جی اس کو ہم نے انٹ top secret کہا ہوا تھا ہمیں دو اور integers چاہیے تو top secret کبھی نام بدل دو ہم ان کو انٹ i j k کر دیتے ہیں تین integer data ممبرز کر دیتے ہیں کلاس one کے اندر کلاس two کے جو functions کلاس one کو manipulate کرنا چاہ رہے تھے وہ اب کام نہیں کریں گے because class one کی implementation has changed how it worked has changed it is critically important کہ یہ کام جو ہے یعنی دو کلاس اس کو آپس میں friend declare کرنا یہ بہت سوچ سمجھ کے کیا جائے only when necessary when is it necessary can we think of an example I can think of one example and that belongs to the field of mathematics دیکھے ہمارے پاس مات میں ایک انٹیٹی ہوتی ہے جس کام straight line کہتے ہیں straight line کی equation یاد ہے y equal to mx plus c m کیا ہوتا تھا it is the slope of the line کیکنہ x axis کے ساتھ اس کا انگل کیا بنتا ہے اور اس کا tendent جو ہے basically that is the slope and see جو تھا that was the intercept on the y axis کے لین y axis کو کام پہ کرتی ہے so اگر ہم نے کسی بی جو ہے straight line اس کو دیفائن کرنا ہوں تو we need these two numbers m which is the slope of the line and c which is the y intercept سو now straight off you can think of کیا اگر ہم نے کلاس دیفائن کرنی ہے called straight line تو اس کا private ڈیٹا جو ہے وہ ہوگا انٹ نہیں دول کہہ لیں double m comma c so you are double slope comma intercept let's use names which are self explanatory اور پھر اس کے ساتھ اس کے اپنے member functions آجائیں گے جو public ہوں گے etc چیلے یہ ایک کلاس بن گئی ایک اور کلاس ہمارے پاس ہوسکتی ہے again ڈیٹ کی example سے وہ کلاس ہے let's say quadratic کی so we have now something which is a parabola یعنی x squared والی equation ہے اور اس کی بھی اگر equation لکھی جائے تو ہم لکھتے ہیں y is equal to a x squared plus b x plus c where a b and c for the moment are real constants سو اگر آپ نے یہ quadratic equation جو ہے اس کو دیفائن کرنا ہے as a class تو اس میں صرف آپ کو a b or c ڈیفائن کرنا ہے تینو coefficients اور وہ quadratic ڈیفائن ہو گئی so we can define class quadratic private double a comma b comma c چلیں ہمارے پاس دو کلاسیں آگئی ایک کلاس ہے straight line کو دیفائن کرتی اور ایک ہے جو کہ a quadratic curve کو دیفائن کرتی ہے کرنا ہم کیا چاہتے ہیں I'm sure اگر آپ نے میت پڑی ہوئی ہے تو آپ کو ضرورہ کبھی نہ کبھی یہ ایک problem حال کرایا ہو گا کہ جی بتائیں کہ straight line جو ہے اس پرابلہ کو کہاں پے intersect کرتی ہے کہنی اگر quadratic curve ہے تو straight line اس کو intersect کرے گی یا نہیں کرے گی اطلب ہوسکتا ہے کہ straight line نیچے سے گزر رہی ہو اگر کرے گی intersect تو ہوسکتا ہے وہ ایک point پے کر رہی ہو which is a tangent اور ہوسکتا ہے کہ وہ دو جوگوں سے اس کو کات رہی ہو اور اس کے لیے ہم کو equation set up کر لیتے ہیں اور ان کو اپس میں as simultaneous equations solve کرتے ہیں اور eventually ہمارے پاس result آجاتا ہے کہ یا result نہیں آیا جی intersection کوئی نہیں ہے یا دو roots نہیں بنی ان کی single value آگی یہ نہیں tangential line ہے اور یا یہ دو جگوں سے کارتی ہے تو دو points کی values آجاتی ہیں یہ جو equations ہیں جب ہم set up کرتے ہیں تو پتہ چلتے جی ان کے اندر m بھی استعمال ہو رہا ہے c بھی استعمال ہو رہا ہے a بھی استعمال ہو رہا ہے b بھی استعمال ہو رہا ہے اور c quadratic والا بھی استعمال ہو رہا ہے پہلا c جو تھا that was the straight line والا intercept on the y axis so from a programming perspective if I had an object l1 of type straight line and I had an object q1 of type quadratic اور میں یہ پوچنا چاہتا پوچنا چاہتا کہ جی intersection of l1 with q1 ہے کہ نہیں ہے now here is a situation where I again need either a friend function of both classes کہ جی اس کا دیتہ بھی مل جائے اس کا دیتہ بھی مل جائے اور دونوں کا manipulate کرکہ ہم دیکھ سکیں گے جی intersection کہاں ہوتا ہے اور یا میں کلاسز کو آپس میں friends declare کر دوں اور پھر ان کے کوئی member functions لکھیں جو بتاتے ہیں کہ کہاں intersection ہوتی ہے یہ contrived example نہیں تھا یہ real world example ہے and you can think of 20 other examples جہاں پہ ایک کلاس کو دوسری کلاس کے اندر جھاکنے کی ضرورت پیش آ جائے لیکن just to recap it is not something to be done all the time it should be done only when necessary using friend functions is normally a better idea using friend classes مینس دونوں کلاسز آپس میں لنک ہو گئی ہیں اگر کسی ایک کلاس میں چینج کیا آپ نے code کو آپ نے اگر اس کی implementation بدل دی تو دونوں کلاسز کو recompile کرنا پڑ جائے گا normally change کی وجہ سے دوسری کلاس کے اندر بھی چینج ہی کرنا پڑ جائے گا اور پھر دونوں کو recompile کریں گے so we have lost the principle of separation of interface from the implementation so as i said earlier use it carefully and wisely not all the time now let's just conclude and talk about what are the limitations on this friendship business if i declare you to be my friend میں کہتا ہوں کہ جی student a is my friend or student b جو ہے وہ کہتا ہے کہ جی class fellow c is my friend does it mean کہ جی class fellow c is also now my friend سوچے ذرا میں نے کہا ہے آپ میرے دوست ہیں لہذا میں نے آپ کو اپنے ideas thoughts whatever وہ آپ کو بتا دیئے آپ نے کہا کہ جی یہ شخص جو ہے وہ آپ کا دوست ہے لہذا آپ کے inner thoughts feelings ideas اس کو آپ پتا ہیں کیا اس کا یہ مطلب ہے کہ وہ جو تیسرہ شخص ہے اس کو میرے thoughts and ideas کا بھی علم ہو گیا اس کے اتنا добویہ ہے کہی ہے تو میرے اتنے پر لیکن جو میرے thoughts and ideas کیونکہ میں ہم کو بھی ہم سے واقعت نہیں نے ہم کو pikeارہ رہا ہے ہمیں بنانا کیا بھی لہاں بھی آجتا ہے اس اس طرف لہذا کو اس کی حفاظ بھی اپنےáficاہ기가 جانا ہے اس یہ جانا ہے جانا ہے جانا ہے اس کی حفاظ میں لہذا جانا ہے یہ جانا ہے جانا ہے جانا نہیں ہے ایک بڑیک ہے، بی ہے جو کچھ اور کچھ بڑیک ہے، لیکن ایک بڑیک ہے۔ لہذا، بہت کچھ بڑیک ہی نہیں ہے۔ ایسا بہت کچھ، میں آپ میں کچھ بڑیک ہی بڑیک ہے۔ میں نے اپنے خوصوں کیا ہے، تو آپ کے لئے کھول دیئے۔ لیکن جب تک آپ کچھ بڑیک نہیں کریں گے، میں آپ کا دوست ہوں۔ تو آپ کے خوصیں مجھے نظر نہیں آئے گے۔ تو ڈیرری بہت بہت ہے،unning ڈیرات ہوتا ہے۔ ایک بڑیک ہی پیدہ ہے، کچھ ماہ بڑیک ہی بڑی یہ نہیں ہے۔ Ministry ڈیری بی ہے ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ ڈیرہ مہدار ہے۔ لہذا، ایک طرف کی فرنشپ ڈیر کردیں اور سمجھیں کے کام ہو گیا۔ are not friends. We means a two-way relationship. یہاں پہ جب ہم friend functions اور friend classes کی بات کرتے ہیں تو friend keyword جو ہے وہ one-way relationship کائم کرتا ہے اور two-way relationship کائم کرنے کے لیے دونوں سائیٹس کو indipendently ڈیکلیر کرنا پڑتا ہے یہ friend ship کا attribute. چلیں زراہسا ریویو کر لیتے ہیں کہ ہم نے یہ سارہ سفر تھا کلاسز کا وہ کہاں سے شروع کیا اور friend ship تاک ہم کیسے پہنچے؟ دیکھیں، I introduce the concept of classes by saying it is a very important concept which allows us to separate implementation from the interface. ہم classes ایک user-defined data structure ہے یا data type ہے وہ ڈیکلیر اب کر سکتے ہیں جس کے اندر ہم کچھ حصہ جو ہے normally data members but sometimes utility functions بھی جو ہے ان کو private declare کر دیتے ہیں وہ ڈیکلیر کر دیتے ہیں وہ ڈیکلیر کے بہر سے نظر نہیں آتے کچھ حصہ جو ہے اس کلاس کے ان کو ہم public declare کر دیتے ہیں they become the interface for the class بہر سے بہر کی دنیا سے وہ functions یا interface method جو ہم وہ نظر آ سکتے ہیں اور یہ جو ہیں interface method یا public functions ان کو class کے اندر سب کچھ نظر آتا ہے they can manipulate the data یہ تو ہم نے class کی definition کی بات کی اور data encapsulation اور hiding کی بات کی اس کے بعد آج کی لیکچر کے اندر میں نے ایک انٹروڈیوز کیا concept کہ جی اگر ہمار پاس کوئی بہر function بیٹھا ہو ایک utility function ہو جو class کے internal data structure کو manipulate کرنا چاہے یا پڑھنا چاہے اس کو کیسے ہم استعمال کریں گے اس کے لیے ہم نے friend keyword استعمال کیا اور friend keyword سے ہم نے ایک external function کو as a friend declare کر دیا once we have declared an external function a friend of a class it has access to the complete inner structure of the class including all private data this is important to understand and therefore it is also dangerous from a software engineering perspective what about class to class relationships I again give you a little example ایک justification دی because suppose I'm never straight line or quadratic equation جو ہے اس کی intersections دھولنی ہے تو now classes need to interact if they need to interact classes must be friends of one another لہذا ہم نے classes کو بھی as friends declare کرنا چاہے اور پھر ان ساری چیزوں کو کر کے میں نے کہا کہ دیکھیں idea is that it is a utility it is a useful feature that sometimes we need to use but we should use it very sparingly and very carefully because it basically negates the whole concept of encapsulation and data hiding اس کے بعد ہم نے کچھ اس کے principles کی بات کی کہ جی friendship کے بارے میں یا friend functions یا friend classes کے principles کیا ہیں کہ friendship is granted it is never taken so our class declares کہ میرا دوست کون ہے it declares friend functions it declares friend classes then if a class declares another class as a friend the other way relationship is not established it's one way so declaration or granting of a right is one way the owner of the right grants it so the class itself grants the privilege of access to outsiders or to other classes keep that in mind it is not transitive it does not go and b is a friend of c therefore a is a friend of c no it does not work that way it is restricted to a one step relationship a is a friend of b b is a friend of c if a wants c to be a friend a will have to say c is my friend so یہ خیال دا کیگہ friendship is granted and then it is not two way and it doesn't move on once we've done that we will come up with situations where we need these facilities but normally we will go back to our normal hidden data and normal class manipulation next time we will talk about some new topics which again c++ provides to make our programming life easy اُس وقتا کیلئے جازت دیجے خدا حافظ