मैंने हाल ही में सी ++ में friend class
अवधारणा के बारे में सीखा है (मैंने थोड़ी देर के लिए चारों ओर गुगल किया है, लेकिन यह answer मुझे तब तक हंसता है जब तक मुझे सबसे महत्वपूर्ण भागों को याद नहीं आया), और मैं इसे परियोजना में शामिल करने की कोशिश कर रहा हूं मैं अभी काम कर रहा हूँ। संक्षिप्त प्रश्न अंत में सिंगल आउट किया गया है, लेकिन आम तौर पर, मैं द्वारा अपने कामकाजी कोड में आगे की घोषणाओं की पूरी कमी से उलझन में हूं।मित्र वर्ग अवधारणा के लिए आगे की घोषणा की आवश्यकता क्यों नहीं है?
सभी और (उप) फ़ोल्डरों के माध्यम से अलग होती है एक अलग ज और सीपीपी फ़ाइल में हर एक को है, लेकिन इस निर्भरता के बारे में लग रहा है करने के लिए पर्याप्त होना चाहिए:
// FE.h - no implementations - no .cpp file
class FE
{
private:
virtual void somePrivateFunc() = 0;
// 90% virtual class, interface for further implementations
friend class TLS;
};
// DummyFE.h
#include "FE.h"
class DummyFE :: public FE {
/* singleton dummy */
private:
// constructor
public:
static DummyFE& instance();
};
// DummyFE.cpp
#include "DummyFE.h"
// all Dummy FE implementation
// ImplFE.h
#include "FE.h"
class ImplFE :: public FE { /* implemented */ };
// ImplFE.cpp
#include "FE.cpp"
// all Impl FE implementations
// SD.h - implements strategy design pattern
// (real project has more than just FE class in here)
#include "FE.h"
#include "DummyFE.h"
class SD
{
private:
FE &localFE;
public:
SD(FE ¶mFE = DummyFE::instance());
// ... and all the other phun stuff ...
friend class TLS;
};
// SD.cpp - implementations
# include "SD.h"
/* SD implemented */
// TLS.h - implements strategy design pattern
(on a higher level)
#include SD.h
class TLS{
private:
SD *subStrategy;
public:
void someFunctionRequiringFriendliness();
}
// TLS.cpp - implementations
#include "TLS.h"
void TLS::someFunctionRequiringFriendliness(){
this->subStrategy->localFE.somePrivateFunc(); // ok!
}
अब, मुझे पार्टी को सभी निर्भरताओं के साथ वास्तव में संकलित करने के लिए यह मिल रहा है (इसे इसे काम करने के लिए अंत में कक्षा आरेख में लिखना था), लेकिन अब यह करता है। तथ्य यह है कि वास्तव में मुझे भ्रमित कर रहा है, यह कोई आगे की घोषणा की आवश्यकता नहीं थी। मैं पहले से आगे की घोषणाओं के बारे में जानता हूं, और बस मामले में, मैंने this answer के साथ अपनी याददाश्त को ताज़ा कर दिया।
तो, कोशिश करते हैं और यह स्पष्ट रखने के लिए, मेरे सवाल: जब एक दोस्त के रूप class TLS
घोषणा करते हुए किस तरह कोई स्पष्ट आगे घोषणाओं की जरूरत थी? क्या इसका मतलब यह है कि friend class
घोषणा सभी में आगे की घोषणा है? मेरे लिए, सहजता से, यहां कुछ याद आ रही है ... और चूंकि यह सामान्य रूप से संकलित और काम करता है, क्या कोई मेरी अंतर्ज्ञान को सही करने में मदद कर सकता है? : डी
पीएस प्रश्न के इतने लंबे परिचय और कोड का एक गुच्छा के लिए खेद है। कृपया, मेरे कोड अवधारणा पर टिप्पणी न करें - दोस्तों यहाँ अच्छे हैं, मुझे पूरा यकीन है कि यह मेरे वर्तमान प्रोजेक्ट के लिए सही है (यह इस कंकाल से देखने में थोड़ा मुश्किल है)। मैं सिर्फ यह जानना चाहता हूं कि कहीं भी आगे की घोषणा की आवश्यकता क्यों नहीं थी।
एचएम। अजीब। मेरे पास सिर्फ वह स्थिति है जो आपने कहा है * कोड के मेरे संस्करण में संकलित नहीं है (यह इस तथ्य से यहां परिलक्षित होता है कि एफई टीएलएस घोषित नहीं करता है, या इसे बिल्कुल शामिल नहीं करता है) - और यह काम करता है! यही मुझे भ्रमित कर रहा है! आह, और साथ ही, मैंने अभी देखा है कि आपने 'मित्र श्रेणी ए' के बजाय वाक्यविन्यास 'मित्र ए' का उपयोग किया था। क्या आप उस पर विस्तार कर सकते हैं, क्या मैंने गलती से आगे बढ़ने और मित्र घोषणा को एक में विलय करने का प्रबंधन किया? – penelope
नोट: पहला स्निपेट सी ++ 03 में संकलित नहीं होगा (उन लोगों के लिए जो अभी तक सी ++ 11 का उपयोग नहीं कर सकते हैं)। दूसरा स्निपेट जी ++ 4.5 या क्लैंग ++ 3.0 (यहां तक कि सी ++ 11 मोड में) के साथ संकलित नहीं है। –
@ लचियन मैं उलझन में हूं कि आपने अपना दूसरा उदाहरण कैसे संकलित किया? इसने मुझे यह प्रश्न पूछने के लिए प्रेरित किया जो आपके दूसरे उदाहरण को संकलित नहीं करना चाहिए: http://stackoverflow.com/questions/14114956/friend-declaration-not-forward-declaring – JaredC