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 c1, my_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_class, my_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_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(); } }; my_class cefel_classes(my_class c1, my_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 dc1, double_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 נוצרו עוד קודם.
אין תגובות:
הוסף רשומת תגובה