मान लीजिए कि मेरे पास कक्षा F
है जो कक्षा G
(वैश्विक नामस्थान में) और C
(नामस्थान A
में) के लिए मित्र होना चाहिए।सी ++ मित्र वर्ग को केवल अन्य नामस्थानों में आगे की घोषणा की आवश्यकता क्यों है?
A::C
को दोस्त बनना,F
आगे घोषित किया जाना चाहिए।G
पर मित्र होने के लिए,F
की कोई और घोषणा आवश्यक नहीं है।- इसी तरह, एक वर्ग
A::BF
आगे घोषणा
निम्नलिखित कोड इस दिखाता है और जीसीसी 4.5 के साथ संकलित, कुलपति ++ 10 और कम से कम के साथ एक अन्य संकलक बिना A::C
के दोस्त हो सकता है।
class G {
friend class F;
int g;
};
// without this forward declaration, F can't be friend to A::C
class F;
namespace A {
class C {
friend class ::F;
friend class BF;
int c;
};
class BF {
public:
BF() { c.c = 2; }
private:
C c;
};
} // namespace A
class F {
public:
F() { g.g = 3; c.c = 2; }
private:
G g;
A::C c;
};
int main()
{
F f;
}
मेरे लिए यह असंगत लगता है। क्या इसका कोई कारण है या क्या यह मानक का एक डिज़ाइन निर्णय है?
+1। –
एक उचित व्यक्ति पूछ सकता है कि "दोस्त वर्ग :: एफ;" "(जैसा कि ओपी के कोड में दिखाया गया है) लिखने के लिए पर्याप्त क्यों नहीं है, इस प्रकार स्पष्ट रूप से 'एफ' को वैश्विक नामस्थान में धक्का दे रहा है। मुझे लगता है कि जवाब "एक योग्य आईडी कभी भी एक नया नाम घोषित नहीं करता है" के आधार पर है, लेकिन मुझे यकीन नहीं है कि इस बिंदु पर मानक क्या कहता है। – zwol
@Zack यह मेरा प्रारंभिक प्रश्न भी था: जब मैं किसी अन्य नामस्थान में कक्षा को स्थानांतरित करता हूं, तो मुझे आगे की घोषणा जोड़ने की आवश्यकता क्यों होती है? लेकिन इस विषय पर पहले से ही कुछ चर्चाएं हैं (उदा। Http://stackoverflow.com/questions/2059665/, http://stackoverflow.com/questions/1368642/)। ऐसा लगता है कि एक ही दायरे में आगे की घोषणा की आवश्यकता नहीं है एक सुविधा है जो मानक के लेखकों द्वारा दी गई है। – pesche