2013-05-08 11 views
5
//#define NOT_WORKS 
#define HOW(X) 0 

struct A { 

}; 

struct B { 
    A a; 
}; 

struct C { 
    B b; 
}; 

int main(int argc, char **argv) { 
    A B::*ba = &B::a;  // ba is a pointer to B::a member 
    B C::*cb = &C::b;  // cb is a pointer to C::b member 

#ifdef NOT_WORKS 

    { A C::*ca = &C::b::a; } // error: Symbol a could not be resolved/error: ‘C::b’ is not a class or namespace 
    { A C::*ca = cb + ba; }  // error: invalid operands of types ‘B C::*’ and ‘A B::*’ to binary ‘operator+’ 

    A C::*ca = HOW(???);  // is possible to reach C::b::a by a member pointer? 

#endif 

    C cptr; 
    A aptr = cptr.*cb.*ba; // is pointer inference chaining the only solution? 

    return 0; 
} 

सदस्य संकेत का अनुमान श्रृंखलन एक आंतरिक सदस्य तक पहुंचने के लिए एकमात्र समाधान है के सदस्य के लिए, मैं एक ही प्रकार के टेम्पलेट का उपयोग कर यह संपुटित कर सकते हैं?सी ++ सूचक के सदस्य


अब कोड जीसीसी के साथ संकलित किया जा सकता

एक सदस्य सूचक द्वारा धन्यवाद हर कोई

+0

इस कोड को बहुत ही अजीब लग रही है और मैं इसे संकलित करने के लिए असमर्थ हूँ। वास्तव में क्या मतलब है ए बी :: * बीए = &B::a; क्या आप वाकई सही हैं? मुझे कोड दिखाई देता है जैसे: ए ए; बी बी; बीएए = ए; और पॉइंटर्स के साथ एक ही चीजें, लेकिन कभी भी "::" –

+1

@AdrianMaire: 'AB :: * ba = &B::a;' '' 'के प्रकार के 'बी' के सदस्य के लिए सूचक होने के लिए 'बीए' घोषित करता है और इसे प्रारंभ करता है 'और बी :: ए' के साथ। यह कंपाइलर ठीक होना चाहिए। –

+0

@ चार्ल्स बेली: धन्यवाद, मैं इसके बारे में और जानूंगा। –

उत्तर

2

तक पहुँचने के लिए सी :: ख संभव है :: एक?

की क्रमबद्ध करें:

C c; 
A B::*ca = &B::a; // usage: c.b.*ca; 

सूचक अनुमान एकमात्र समाधान चेनिंग है?

हाँ

संबंधित मुद्दे