2015-11-17 5 views
56

शामिल है मैं एक सी ++ परियोजना के कोड पढ़ रहा हूँ और यह निम्नलिखित रूप से कुछ कोड में शामिल हैं:एक भ्रामक typedef वर्ग गुंजाइश

namespace ns { 
    class A {}; 
    class B {}; 
} 

struct C { 
    typedef ns::A* ns::B::* type; 
}; 

किसी typedef पंक्ति का अर्थ समझाने कर सकते हैं? typens::B के सदस्य को किसी प्रकार का पॉइंटर लगता है जो ns::A पर इंगित करता है, लेकिन मुझे यकीन नहीं है।

कक्षा A और वास्तविक कोड में B खाली नहीं हैं, लेकिन मुझे लगता है कि इसे यहाँ प्रासंगिक नहीं है। और यहां एक live example है।

+0

इस प्रकार का उपयोग कैसे किया जाता है? क्या आप इसका कुछ उदाहरण भी कर सकते हैं? –

+1

[अजीब सामान] (http://ideone.com/qFMwRW) वास्तव में! @ जोचिमपिलबोर्ग –

+1

सदस्य फ़ंक्शन के लिए सूचक की तरह दिखता है, लेकिन पैरामीटर गुम हैं। शायद यह 'typedef ns :: ए * एनएस :: बी :: *() प्रकार के बराबर है;' – user463035818

उत्तर

41
ns::B::* 

B का पॉइंटर-टू-सदस्य-चर है। फिर ns::A* इसका प्रकार है।

तो पूरे घोषणा का मतलब होता

प्रकार के B का सूचक-टू-सदस्य-चर ns::A*

+0

तो कोड समझने के लिए इतना कठिन नहीं लगता है। मुझे पॉइंटर-टू-सदस्य के बारे में अधिक अध्ययन करने की आवश्यकता है :) – xovano

+1

@xovano नामस्थान विनिर्देशक यह बुरा दिखता है। अन्यथा 'int Foo :: *' जैसे कुछ को हर किसी द्वारा समझा जाता है। – vsoftco

28

The answer by @vsoftco पहले से ही सवाल का मूल उत्तर देता है। यह उत्तर दिखाता है कि कोई typedef का उपयोग कैसे कर सकता है।

#include <iostream> 
#include <cstddef> 

namespace ns { 

    struct A {}; 

    struct B 
    { 
     A* a1; 
     A* a2; 
    }; 
} 

struct C { 
    typedef ns::A* ns::B::*type; 
}; 

int main() 
{ 
    C::type ptr1 = &ns::B::a1; 
    C::type ptr2 = &ns::B::a2; 

    ns::B b1; 
    b1.*ptr1 = new ns::A; // Samething as b1.a1 = new ns::A; 

    return 0; 
} 
+1

'बी 1। * पीआरटी 1 'वाह। तो यह अनिवार्य रूप से स्थानीय सूचक ऑफसेट है? (यानी, आप शुरुआती बिंदु के रूप में 'b' के पते के साथ' ptr1' को संदर्भित कर रहे हैं?) – JAB

+2

@JAB यह इसके बारे में सोचने का एक अच्छा तरीका है। – vsoftco

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