2017-07-21 20 views
6

यहाँ मेरी कोड है, और आईडीई देव सी ++ 11व्युत्पन्न वर्ग के सदस्य कार्य करने के लिए सूचक बारे

#include<iostream> 
using namespace std; 

class A{ 
    public: 
     int a=15; 
}; 
class B:public A 
{ 

}; 
int main(){ 

    int A::*ptr=&B::a; //OK 
    int B::*ptr1=&A::a; //why? 
    int B::A::*ptr2=&B::a;//why? 
    int B::A::*ptr3=&A::a; //why? 

} 

मैंने पढ़ लिया है प्रोग्रामिंग भाषाओं है - सी ++ और मुझे पता है &B::a के प्रकार int A::* है, लेकिन मैं यह समझ में नहीं आता कि अगली तीन पंक्तियां संकलन क्यों पारित करेंगी। और मेरे लिए सबसे अजीब चीज int B::A::* का वाक्यविन्यास है, इसका क्या अर्थ है? मैं सिर्फ C/C++ का नवागंतुक हूं, इसलिए कृपया मेरा अजीब सवाल बर्दाश्त करें।

+1

@ रॉन अहम .. यह ** ** [एमसीवी] है। 'ptr' प्रकार 'int ए :: *', 'ptr2' प्रकार का है' int B :: ए :: *', आदि .. जैसा कि आप देख सकते हैं: ओपी द्वारा पोस्ट किया गया कोड [बस ठीक से संकलित करता है] (http://ideone.com/Cz2Bmg), वे सिर्फ ** क्यों ** संकलित हैं के बारे में उलझन में हैं। –

+0

@ AlgirdasPreidžius True। मुझे सही साबित होना है। – Ron

+1

आपको क्यों लगता है कि उन्हें संकलन पास नहीं करना चाहिए? –

उत्तर

1

आरेख प्रतिनिधित्व मदद मिल सकती है कि आप समझते हैं कि ऐसा क्यों ठीक है और संकलित int A::*ptr = &B::a;

int B::*ptr1 = &A::a;

int B::A::*ptr2 = &B::a;

int B::A::*ptr3 = &A::a

दिलचस्प एक बार आप विरासत में मिला वर्ग

में एक ही चर reinitialize हो जाएगा
#include<iostream> 
using namespace std; 

class A { 
public: 
    int a = 15; 
}; 
class B :public A 
{ 
public: 
    int a = 10; 
}; 
int main() { 

    int A::*ptr = &B::a; //Waring class B a value of type int B::* cannot be 
         //used to initialize an entity of type 'int A::*' 
    int B::*ptr1 = &A::a; // why? 
    int B::A::*ptr2 = &B::a;//Waring class B a value of type int B::* cannot        
         // be used to initialize an entity of type 'int A::*' 
    int B::A::*ptr3 = &A::a; //why? 

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