2012-02-25 8 views
6

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

ठीक है, हम शुरू कर सकते हैं। मेरे पास एक सार विधि है succesorsFunction और मैं इसे राज्य पर पॉइंटर्स का संग्रह वापस करना चाहता हूं। मैं कार्यान्वयनकर्ताओं को एक विशिष्ट कंटेनर पर मजबूर नहीं करना चाहता हूं; मैं उन्हें चुनने देता हूं (वेक्टर, सूची, आदि)।

तो यह इस तरह दिखता है:

class Problem 
{ 
public: 
    virtual list<const State*>::iterator succesorsFunction(const State &state, list<const State*>::iterator result) const = 0; 
}; 

समस्या यहाँ सूची में सबसे स्पष्ट इस्तेमाल होता है। सी ++ में आप इसे कैसे करते हैं?

मैं टेम्पलेट का उपयोग कर के बारे में सोचा है, लेकिन फिर मैं दो समस्याओं का सामना करना पड़ा: 1) ऐसा लगता है कि आप सार तरीकों के साथ यह नहीं कर सकते लगता है (या मैं गलत हूँ) 2) मैं कैसे टेम्पलेट बताऊँ यह संकेत को शामिल करना चाहिए? कहना?

+2

Boost.Range के प्रकार- मिट पर्वतमाला यहाँ मदद मिल सकती है। – Xeo

+0

क्या आप इस फ़ंक्शन पर विस्तार कर सकते हैं और यह वर्चुअल होने के लिए प्राप्त किया जाना चाहिए? वैकल्पिक दृष्टिकोण हो सकते हैं। –

+2

तो आप 'IENumerable ' के समान कुछ वापस करना चाहते हैं? – svick

उत्तर

2

आप सी ++ में रिटर्न प्रकारों के आधार पर विधियों को अधिभारित नहीं कर सकते हैं।

इसके अलावा, सी ++ में "कंटेनर" के पास समान आधार नहीं है (जैसे जावा में Collection), ताकि आप एक सामान्य कंटेनर वापस नहीं कर सकें।

मुझे डर है कि ऐसा करने का कोई साफ तरीका नहीं है।

मैं केवल ओवरलोड (पैरामीटर द्वारा) या विभिन्न फ़ंक्शन नाम लिखूंगा।

अपने प्रश्नों के लिए:

1) आप कर सकते हैं। आपको क्या लगता है कि आप नहीं कर सकते?

2) उसी तरह आपने list: list<const State*> - const घोषित किया है।

+4

मुझे नहीं लगता कि उसने वापसी मूल्य से अधिभार के बारे में कुछ भी कहा था; एक ही रिटर्न प्रकार के साथ कई कार्यान्वयन हैं। वह सिर्फ वापसी प्रकार को सामान्य रूप से कार्यान्वित करना प्रतिबंधित नहीं करना चाहता है। –

+0

@ अर्नेस्ट फ्राइडमैन-हिल उनके सवाल का कहना है कि वह एक संग्रह वापस करना चाहता है और वह संग्रह को प्रतिबंधित नहीं करना चाहता (हालांकि कोड एक पुनरावर्तक देता है)। –

+0

... जो रिटर्न प्रकार से ओवरलोडिंग के बारे में कुछ भी नहीं कहता है। –

0

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

template <typename yourType> 
yourType& succesorsFunction(const State &a, yourType &result){//Your return type can be without reference 
    //Your body 
    return result; 
} 

आप vector<State> a तर्क इस तरह के साथ उदाहरण के लिए अपने समारोह कॉल करते हैं:

sucessorsFunction(b,a);// b is your State object 

कटौती प्रक्रिया स्वचालित रूप से निष्कर्ष निकाला जाएगा कि yourType वास्तव में vector<State> प्रकार है, जो मुझे लगता है कि आपकी समस्या का समाधान होता है। साथ ही, यह आर्हिटेक्चर आपको उदाहरण के लिए नए वर्ग प्रकार माईवक्टर (जो States के सरणी रखता है) बनाने के लिए बनाता है और MyVector ऑब्जेक्ट succesorsFunction पर पास करता है।

+0

मैंने ऐसा करने की कोशिश की लेकिन यह अमूर्त विधि के साथ काम नहीं किया। मैं अंत में = 0 को भी हटा सकता हूं और इसे खत्म कर सकता हूं। आपके उत्तर – wolfovercats

+0

@wolfovercats के लिए धन्यवाद यदि आप इस प्रकार को नहीं जानते हैं तो आप परिणाम कैसे पॉप्युलेट करेंगे? –

+0

@LuchianGrigore मुझे इस प्रकार का पता है; यह राज्य * है। – wolfovercats

0

तुम सच में एसटीएल कंटेनर उपयोगिता को लागू करना चाहते हैं, कोशिश निम्नलिखित:

template <template <typename, 
        typename = std::allocator<const State *> > class Container> 
Container<const State*> successorsFunction(const State &state, const Container<const State*> &c) const 
{ 
    // return something useful. 
} 

आप इस समारोह आभासी होना होने पर जोर देते हैं, तो यह एक सदस्य समारोह टेम्पलेट नहीं किया जा सकता है, बस के साथ ओवरलोड जिन प्रकारों का आप समर्थन करना चाहते हैं, तो आप उन्हें आभासी बना सकते हैं।

0

यह C.T's उत्तर का एक विस्तार है। कृपया याद रखें कि यदि आप पॉइंटर्स के कंटेनर को वापस करते हैं तो आपको उन्हें स्पष्ट रूप से रिलीज़ करना होगा या std::unique_ptr का उपयोग करना होगा।
बस एक एफवाईआई .. जैसा कि आप सी # पृष्ठभूमि से हैं।

आप राज्य का उपयोग कर सकते हैं या इसे टेम्पलेट भी कर सकते हैं।

template<typename Type, 
     template< typename, typename = std::allocator<Type*> > class Container 
     > 
Container<Type*> Successor(const Type& x) 
{ 
    Container<Type*> cont; 
    // something. 
    cont.push_back(new Type(x)); 
    return cont; 
} 

और कॉल यह

vector<State*> states = Successor<State, vector>(State(10)); 
संबंधित मुद्दे