2011-05-28 9 views
7

वहाँ इस के आसपास कोई तरीका है:पुनरावर्ती दोस्त कक्षाएं

prog.cpp:8: error: invalid use of incomplete type ‘struct B’ 
prog.cpp:1: error: forward declaration of ‘struct B’ 
+0

मुझे लगता है कि सबसे करीब आप प्राप्त कर सकते हैं 'दोस्त वर्ग b' –

+1

वास्तव में क्या आपको लगता है कि आप बी और सी के निर्माता की जरूरत के लिए एक दूसरे को दिखाई के लिए क्या करना चाहता था है? –

+0

@ माइक, यह वास्तव में एक सिंथेटिक उदाहरण है। वास्तविक स्थिति यह है कि, जटिल होने के कारण जटिल होने के कारण, मैं बी पर निर्भरता को बी – BCS

उत्तर

5

तुम बस ऐसा नहीं कर सकते:

class B; 

class C { 
public: 
    C() { } 
private: 
    int i; 
    friend B::B(); 
}; 

class B { 
public: 
    B() { } 
private: 
    int i; 
    friend C::C(); 
}; 

त्रुटि देता है। परिपत्र निर्भरता को हटा दें।

+0

ओह की परिभाषा पर निर्भरता को बल देने की अनुमति नहीं दे सकता। । । । Fud। – BCS

+0

आप पूरी कक्षा में दोस्ती दे सकते हैं, सिर्फ व्यक्तिगत सदस्यों के लिए नहीं। – Nemo

+0

@ नीमो: दरअसल। –

3

IBM's documentation के अनुसार (जो मुझे पता है प्रामाणिक नहीं है):

A class Y must be defined before any member of Y can be declared a friend of another class.

तो मुझे लगता है जवाब है "नहीं"।

बेशक

, तो आप उपयोग कर सकते हैं

friend class B; 

... friend B::B() के बजाय, लेकिन वह बी के सभी सदस्यों को दोस्ती देता है। और आप शायद पहले से ही जानते थे।

2

चूंकि आप दोस्ती के बारे में बहुत चुनिंदा हैं (विशिष्ट वर्गों को दिए गए विशिष्ट सदस्य कार्यों तक पहुंच), Attorney-Client Idiom आपको जो चाहिए वह हो सकता है। मुझे यकीन नहीं है कि यह रचनाकारों के साथ कैसे काम करेगा, हालांकि।

1

मुझे एहसास है कि यह वास्तव में मूर्ख विचार है, लेकिन क्या आप सैद्धांतिक रूप से विरासत वर्ग के रचनाकार मित्रों को बनाकर विरासत में इसे पूरा नहीं कर सकते? कोड कम से कम, संदिग्ध हालांकि यह हो सकता है।

class A { 
public: 
    A() { } 
private: 
    int i; 
}; 

class D { 
public: 
    D() { } 
private: 
    int i; 
}; 

class B : public A { 
public: 
    B() { } 
private: 
    friend D::D(); 
}; 

class C : public D { 
public: 
    C() { } 
private: 
    friend A::A(); 
}; 
+3

मुझे लगता है कि दोस्ती विरासत में नहीं मिल सकती है ... सी बी और बी का मित्र नहीं है, यह सी के मित्र नहीं है ... – vrince

+0

मैत्री निश्चित रूप से विरासत में नहीं है। – Nemo

+0

सच है। लेकिन यदि आप केवल रचनाकारों को निजी चरों तक पहुंच देना चाहते हैं, तो यह बी और सी में निजी डेटा बी और सी के मूल वर्गों के रचनाकारों तक पहुंच जाएगा - जिसे बी और सी के रचनाकारों द्वारा क्रमशः बुलाया जा सकता है-भले ही बी और सी सीधे एक-दूसरे के निजी डेटा तक नहीं पहुंच सकता है। –