2014-04-05 29 views
5

मेरी समस्या यह है कि मुझे पहले अपने इंटरफ़ेस को परिभाषित करने की आवश्यकता है और फिर इसे कोड में आगे लागू करने की आवश्यकता है, लेकिन मेरी समस्या यह है कि जो काम करता है उसे कक्षा के अंदर जाना जाने वाला प्रकार वापस करना चाहिए क्लास के बाहर अज्ञात प्रतीत होता है मैं विधि लागू करता हूं। क्योंकि प्रकार इनर कक्षा के बाहर समारोह के लिए अज्ञात हैअज्ञात वापसी प्रकार त्रुटि (सी ++)

class Test { 
    class Inner { 
    };  
public:  
    Inner* foo (void); 
}; 

Inner* Test::foo(){ 
} 

इस कोड का उत्पादन त्रुटि:

यह मेरा कोड है। क्या कोई मेरी मदद कर सकता है कि सरल कार्य कैसे करें जो केवल कक्षा के भीतर परिभाषित प्रकार लौटाएगा?

किसी भी मदद के लिए धन्यवाद।

+3

टेस्ट :: इनर * टेस्ट :: foo() –

उत्तर

3

इनर एक नेस्टेड वर्ग और बाहर वर्ग Test यह पूरी तरह से योग्य हो गया है है। वैश्विक स्तर पर आपके पास Inner भी हो सकता है, बस Test के साथ ही, और यह Inner होगा, Test::Inner नहीं।

6

आप की जरूरत है

Test::Inner* Test::foo(){ 

}

एक सदस्य समारोह परिभाषा वर्ग परिभाषा के बाहर है, तो वापसी प्रकार नहीं वर्ग दायरे में है, समारोह के बाकी के विपरीत , इसलिए आपको रिटर्न प्रकार को स्पष्ट रूप से अर्हता प्राप्त करने की आवश्यकता है।

Test::Inner* Test::foo() { 
    //... 
} 

क्योंकि वैश्विक क्षेत्र में Inner वास्तव में अज्ञात, केवल Test::Inner है, तो एक InnerTest अंदर जाना जाता है:

3

आप इस दायरे को निर्दिष्ट नहीं करते हैं, इसलिए, यह अज्ञात बनी हुई है। सी ++ कंपाइलर आपके Test कक्षा के बाहर Inner कक्षा की तलाश करेगा जो एक अलग वर्ग के रूप में भी उपस्थित हो सकता है, लेकिन यह आपके विशेष मामले में नहीं है।

यही कारण है कि आपको रिटर्न प्रकार के लिए भी दायरा प्रदान करने की आवश्यकता होगी। ऐसा नहीं है कि आपको अपनी टेस्ट क्लास के दायरे का उपयोग करने की आवश्यकता होगी, लेकिन बाहर, आपको इसके कारण होना होगा। ,

class Test { 
    class Inner { 
    };  
public:  
    Inner* foo (void); 
}; 

Test::Inner* Test::foo(){ 
//^^^^ 
} 

सच पूछिये तो अगर आप हाल ही में एक संकलक है, तो आप भी ऑटो इस्तेमाल कर सकते हैं, लेकिन तब यह थोड़ा कम व्यापक हो जाता है:

इस प्रकार, सही कोड कुछ इस तरह होगा।

2
class Test { 
class Inner { 
};  
public:  
    Inner* foo (void); 
}; 

Test::Inner* Test::foo(){ 
} 
5

के बाद से कोई भी यह उल्लेख किया गया है, तो आप भी इस में सी ++ 11 कर सकते हैं:

auto Test::foo() -> Inner * {...} 

यह उपयोगी हो सकता है, तो पूरी तरह से योग्य नाम लंबा है। सी ++ 14 में, आप पिछला प्रकार भाग छोड़ सकते हैं और बस:

auto Test::foo() {...} 

यह रिटर्न प्रकार को कम करेगा।

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