संकलक कोड (आमतौर पर ऊपर से) संकलन शुरू होता है और यह इस लाइन का सामना करना पड़ता है:
friend void B::fB(A& a);
इस बिंदु पर
- , संकलक बी के प्रकार की जानकारी के बारे में पता नहीं है तो यह (एक त्रुटि फेंकता 'बी': कक्षा या नामस्थान नाम नहीं है)।
कक्षा बी की आगे की घोषणा द्वारा, कंपाइलर जानता है कि बी के प्रकार सभी सदस्यों के साथ वास्तविक घोषणा के लिए पहले से ही कक्षा है।
वर्ग बी के आगे घोषणा
///////////////
class B;
class A
{
public:
friend void B::fB(A& a);
void fA(){};
};
class B
{
public:
void fB(A& a){};
void fB2(A& a){};
};
फिर भी त्रुटि के बाद नीचे दिए गए कोड रन !!!
क्योंकि आगे की घोषणा सिर्फ एक पहचानकर्ता की घोषणा है जिसके लिए प्रोग्रामर ने अभी तक पूरी परिभाषा नहीं दी है। इसलिए कंपाइलर को कक्षा ए
नोट: कक्षा बी परिभाषाओं को बी के प्रकार पर निर्भर करता है और बी (यानी बी :: एफबी) की परिभाषा भी है ताकि आगे की घोषणा अकेले ही हल नहीं हो सके, कक्षा की पूरी परिभाषा बी वर्ग ए से पहले
4 रन के लिए इस कोड
////////
class B
{
public:
void fB(A& a){};
void fB2(A& a){};
};
class A
{
public:
friend void B::fB(A& a);
void fA(){}
};
फिर भी त्रुटि को परिभाषित करने की जरूरत है !!!
क्योंकि क्लास B सदस्य कार्यों अमेरिकन प्लान & FB2 ग्रुप ए के तर्कों होने लेकिन संकलक एक तो कक्षा एक से आगे घोषणा के द्वारा, हम संकलक के ए नोट प्रकार की जानकारी के बारे में जानता दे सकते हैं के प्रकार की जानकारी के बारे में पता नहीं है: वर्ग बी परिभाषा केवल एक संकल्प कदम का एक ताकि आगे घोषणा का एक नहीं के सदस्यों के प्रकार पर निर्भर 4.
- अंतिम कोड
////// //////////////////
class A; // forward declaration of A needed by B
class B
{
public:
void fB(A& a);
};
class A
{
int i;
public:
friend void fA(A& a); //specifying function fA as a friend of A, fA is not member function of A
friend void B::fB(A& a); //specifying B class member function fB as a friend of A
};
// fA is Friend function of A
void fA(A& a)
{
a.i = 11; // accessing and modifying Class A private member i
cout<<a.i<<endl;
}
// B::fB should be defined after class A definition only because this member function can access Class A members
void B::fB(A& a)
{
a.i = 22; // accessing and modifying Class A private member i in Class B member function fB
cout<<a.i<<endl;
}
int main()
{
A a;
fA(a); // calling friend function of class A
B b;
b.fB(a); // calling B class member function fB, B:fB is friend of class A
return 0;
}
6 व्यायाम:
// Cyclic dependency
#include<iostream>
using namespace std;
class A;
class B
{
public:
void fB(A& a);
friend void A::fA(B& b); //specifying class A's member function fA as a friend of B
};
class A
{
int i;
public:
void fA(B& b);
friend void B::fB(A& a); //specifying class B's member function fB as a friend of A
};
int main()
{
return 0;
}
लेकिन अगर अमेरिकन प्लान में (ए एंड ए) मैं उदाहरण के लिए एक में चर तक पहुँचने के लिए उपयोग करते हैं, a.variable; यह अवैध होगा क्योंकि ए को अभी तक परिभाषित नहीं किया गया था। – ipkiss
@ipkiss yes, क्योंकि यदि आप हेडर क्लास घोषणा में हैं तो आपको पूर्ण परिभाषा की आवश्यकता होगी। लेकिन अगर आपने इसे एक अलग कार्यान्वयन फ़ाइल में किया है, तो आप ए – juanchopanza