יום שני, 15 במאי 2017

חבר (friend) של המחלקה

Friend

ראינו שאין לשום דבר מחוץ למחלקה גישה למשתנים ולפונקציות שבחלק ה private של המחלקה.
יש יוצא דופן:
אם נגדיר פונקציה/מחלקה כלשהי כ friend של מחלקה, היא תוכל לגשת לכל התוכן ה private של אותה מחלקה.

מבנה של מחלקה חברה:

class First{
         .
         .
         .
public:
friend class Second; // זה שם מחלקה האחרת Second 
         .
         .
         .
};

-כך מצהירים על המחלקה Second כ friend של המחלקה First.









מבנה של פונקציה חברה:
class First{
         .
         .
         .
public:
friend Sample(int d); // זה שם פונקציה גלובאלית Sample 
         .
         .
         .
};
int Sample(int d){ ... }
-כך מצהירים על הפונקציה Sample כ friend של המחלקה First.
הפונקציה צריכה להיות מתחת לclass שהצהיר עליה כ friend. 




תוכנית לדוגמה (פונקציה friend):
#include <iostream>
using namespace std;
 
class my_class {
 int x, y, z;
public:
 friend my_class cefel_classes(my_class cx, my_class cy); // הצהרת חברות
 
 my_class(int x1=0, int y1=0, int z1=0) {
  x=x1; y=y1; z=z1;
 }
 void show(){
  cout<<"x: "<<x<<"   y: "<<y<<"   z: "<<z<<"\n";
 }
};
 
my_class cefel_classes(my_class c1my_class c2){
 my_class res;
 res.x = c1.x *c2.x; // גישה למשתנים הפרטיים לא הייתה אפשרית ,friend אם הפונקציה לא הייתה
 res.y = c1.y *c2.y;
 res.z = c1.z *c2.z;
 return res;
}
 
void main() {
 my_class n1, n2(4,4,4), n3(5,5,5);
 n1 = cefel_classes(n2,n3);
 n1.show(); // 20 , 20 , 20
}







תוכנית לדוגמה (מחלקה friend):
#include <iostream>
using namespace std;
 
class my_class {
 int x, y, z;
public:
 friend class double_my_class// הצהרת חברות
 
 my_class(int x1=0, int y1=0, int z1=0) {
  x=x1; y=y1; z=z1;
 }
 void show(){
  cout<<"x: "<<x<<"   y: "<<y<<"   z: "<<z<<"\n";
 }
};
 
class double_my_class{
 my_class c1, c2;
public:
 double_my_class (int x1=0, int y1=0, int z1=0, int x2=0, int y2=0, int z2=0){
  c1.x = x1; c1.y = y1; c1.z = z1// גישה למשתנים הפרטיים לא הייתה אפשרית ,friend אם המחלקה לא הייתה
  c2.x = x2; c2.y = y2; c2.z = z2;
 }
 void show(){
  c1.show();
  c2.show();
 }
};
 
void main() {
 double_my_class dn1;
 dn1.show();  //  0,0,0  0,0,0
}







תוכנית משולבת:
#include <iostream>
using namespace std;
 
class my_class {
/* לא חייבים לציין את שמות המשתנים, אלא רק את סוגם (friend הצהרת חברות יכולה להיות גם באיזור הפרטי. בהצהרות (לאו דווקא */
 friend my_class cefel_classes(my_classmy_class);
 friend class double_my_class;
 int x, y, z;
public:
 my_class(int x1=0, int y1=0, int z1=0) {
  x=x1; y=y1; z=z1;
 }
 void show(){
  cout<<"x: "<<x<<"   y: "<<y<<"   z: "<<z<<"\n";
 }
};
 
class double_my_class{
 friend double_my_class cefel_double_classes(double_my_classdouble_my_class);
 my_class c1, c2;
public:
 double_my_class (int x1=0, int y1=0, int z1=0, int x2=0, int y2=0, int z2=0){
  c1.x = x1; c1.y = y1; c1.z = z1// גישה למשתנים הפרטיים לא הייתה אפשרית ,friend אם המחלקה לא הייתה
  c2.x = x2; c2.y = y2; c2.z = z2;
 }
 void show(){
  c1.show();
  c2.show();
 }
};
 
my_class cefel_classes(my_class c1my_class c2){
 my_class res;
 res.x = c1.x *c2.x; // גישה למשתנים הפרטיים לא הייתה אפשרית ,friend אם הפונקציה לא הייתה
 res.y = c1.y *c2.y;
 res.z = c1.z *c2.z;
 return res;
}
 
double_my_class cefel_double_classes(double_my_class dc1double_my_class dc2){
 double_my_class res;
 res.c1 = cefel_classes(dc1.c1, dc2.c1);  // גישה למשתנים הפרטיים (שהם מחלקות בעצמם) לא הייתה אפשרית ,friend אם הפונקציה לא הייתה
 res.c2 = cefel_classes(dc1.c2, dc2.c2);
 return res;
}
 
void main() {
 double_my_class dn1, dn2(1,1,1,3,3,3), dn3(7,7,7, 7,7,7);
 dn1 = cefel_double_classes(dn2, dn3);
 dn1.show();  //  7 , 7 , 7  ,  21 , 21 , 21
}








האופרטור ':' יכול לפעמים לחסוך את השימוש ב friend. נהוג להשתמש בו.
#include <iostream>
using namespace std;
 
class my_class {
 int x, y, z;
public:
 my_class(int x1=0, int y1=0, int z1=0) {
  x=x1; y=y1; z=z1;
 }
 void show(){
  cout<<"x: "<<x<<"   y: "<<y<<"   z: "<<z<<"\n";
 }
};
 
class double_my_class{
 my_class c1, c2;
public:
 double_my_class(int x1=0,int y1=0,int z1=0,int x2=0,int y2=0,int z2=0) : c1(x1,y1,z1) , c2(x2,y2,z2){} // הפעלת האופרטור בפונקציה הבונה
 
 void show(){
  c1.show();
  c2.show();
 }
};
 
void main() {
 double_my_class dn1, dn2(1,1,1,  4,4,4), dn3(3,3,3,  10,10);
 dn1.show(); // 0,0,0  0,0,0
 dn2.show(); // 1,1,1  4,4,4
 dn3.show(); // 3,3,3  10,10,0
}
כאן לא היה שום שימוש בfriend. הפונקציות הבונות של האובייקטים הופעלו אחרי ה ':' בפונקציה הבונה.
שימו לב שהפונקציות הבונות הופעלו למרות שהאובייקטים c1 ו c2 נוצרו עוד קודם.







אין תגובות:

הוסף רשומת תגובה