क्या पॉइंटर्स का उपयोग किये बिना परिपत्र संदर्भ परिभाषित करने का कोई तरीका है?पॉइंटर्स के बिना सी ++ में परिपत्र संदर्भ
मैं इस तरह somthing की जरूरत है:
struct A;
struct B {
A a;
};
struct A {
B b;
};
धन्यवाद!
क्या पॉइंटर्स का उपयोग किये बिना परिपत्र संदर्भ परिभाषित करने का कोई तरीका है?पॉइंटर्स के बिना सी ++ में परिपत्र संदर्भ
मैं इस तरह somthing की जरूरत है:
struct A;
struct B {
A a;
};
struct A {
B b;
};
धन्यवाद!
आप संदर्भ बजाय
struct A;
struct B {
A& a;
};
struct A {
B b;
};
उपयोग कर सकते हैं लेकिन कोई यह अविवेक के कुछ स्तर के बिना एक परिपत्र संदर्भ बनाने के लिए संभव नहीं है। आपका नमूना क्या कर रहा है वह एक परिपत्र संदर्भ भी नहीं बना रहा है, यह एक पुनरावर्ती परिभाषा बनाने का प्रयास कर रहा है। नतीजा अनंत आकार की संरचना होगी और इसलिए कानूनी नहीं होगा।
यह कैसे काम कर सकता है? अगर मुझे सही याद है, तो संदर्भ के पते का मान सेट के बाद संशोधित नहीं किया जा सकता है, इसलिए आप परिपत्र संदर्भ को परिभाषित नहीं कर सकते हैं। –
@ जॉन, सच में मुझे यकीन नहीं है। हालांकि ओपी ने पूछा कि क्या एक को परिभाषित करना संभव था। यह परिभाषा कानूनी और संकलित है (वीएस -2008 एसपी 1)। – JaredPar
बी के लिए कन्स्ट्रक्टर ए के लिए संदर्भ लेगा, और ए के लिए कन्स्ट्रक्टर इसके बी सदस्य को * के साथ शुरू करेगा। –
नहीं, ऐसा नहीं है। इस तरह की संरचना में अनंत आकार होगा।
आप सीधे पॉइंटर मैनिपुलेशन से बचने के लिए स्मार्ट पॉइंटर्स (और weak_ptr) का उपयोग कर सकते हैं, लेकिन यह इसके बारे में है।
यह कैसे काम कर सकता है? अगर मुझे सही याद है, तो संदर्भ के पते का मान सेट के बाद संशोधित नहीं किया जा सकता है, इसलिए आप परिपत्र संदर्भ को परिभाषित नहीं कर सकते हैं।
ऐसा लगता है कि निम्न (जारेड के उदाहरण के साथ साथ कंस्ट्रक्टर के रूप में ही परिभाषित) काम कर सकता था:
struct A;
struct B {
A& m_a;
B(A& a) : m_a(a) {}
};
struct A {
B m_b;
//construct B m_b member using a reference to self
A() : m_b(*this) {}
//construct B m_b member using a reference to other
A(A& other) : m_b(other) {}
};
पुराना धागा, लेकिन मैंने अभी एक राज्य मशीन में अपना समाधान इस्तेमाल किया है, नीचे टिप्पणी देखें। – kert
C++ में, T o
का अर्थ है "प्रकार T
की एक वस्तु, कुछ T
के लिए नहीं एक संदर्भ (के रूप में, उदाहरण के लिए, सी # और जावा में संदर्भ प्रकारों के साथ)। A
टाइप करें B
(b
नामित) का उप ऑब्जेक्ट होगा, और B
बदले में A
(a
नाम का एक उप ऑब्जेक्ट होगा))। अब, a
में बदले में A
होगा (जिसे फिर से a
कहा जाता है), जिसमें उसके बाद B
है, जो ...
नहीं, यह काम नहीं करेगा।
क्या आप शायद चाहते हैं कि एक B
के लिए एक A
referres, जो बारी में referres कि A
है। यह पॉइंटर्स का उपयोग करके किया जा सकता है:
struct A;
struct B {
A* a;
B(A*);
};
struct A {
B* b;
A(B* b_) : b(b_) { if(b) b.a = this; }
};
B::B(A* a_) : : a(a_) { if(a) a.b = this; }
मुझे नहीं लगता कि इसे संदर्भों का उपयोग करके किया जा सकता है।
ChrisW समाधान इस तरह एक सा सामान्यीकृत किया जा सकता:
template <class defaultState> struct Context;
struct State1 {
Context<State1>& mContext;
State1(Context<State1> & ref) : mContext(ref) {}
};
template <class TDefaultState>
struct Context {
TDefaultState mState;
Context() : mState(*this) {}
};
यह अब आप
Context<State1> demo;
इसके अलावा करने के लिए अनुमति देता है, राज्य के रूप में अच्छी तरह से कुछ टेम्पलेट सहायक कोड
template <class State>
struct TState {
typedef Context<State> TContext;
typedef TState<State> TBase;
Context<State> & mContext;
TState(Context<State> &ref) : mContext(ref) {}
};
struct State2 : TState<State2> {
State2(TContext & ref) : TBase(ref) {}
};
struct State3 : TState<State3> {
State3(TContext & ref) : TBase(ref) {}
};
हो सकता है
जो अब आपको
करने की अनुमति देता है 210Context<State2> demo2;
Context<State3> demo3;
नोट: मुझे 'ए' को 'कक्षा' होने के लिए घोषित करने और बाद में इसे 'संरचना' के रूप में परिभाषित करने के लिए मुझे लगता है। – sbi
उपरोक्त संभवतः संकलित नहीं कर सकता है - और बनाम 2008 के तहत नहीं है - क्योंकि ए को परिभाषित नहीं किया गया है जब संरचना बी को परिभाषित किया जा रहा है। (बीटीडब्ल्यू, हाँ आपकी अगली घोषणाएं: संरचना/वर्ग परिभाषाओं से मेल खाना चाहिए) – quamrana