2012-04-15 14 views
15

मैं ऑब्जेक्ट स्ट्रक्चर के लिए विज़िटर पैटर्न को कार्यान्वित करने की कोशिश कर रहा हूं जिसमें विभिन्न रिटर्न प्रकारों (स्ट्रिंग, हस्ताक्षरित int, unsigned int, आदि) के साथ विधियां हैं।विभिन्न प्रकार के कार्यों को अनुमति देने के दौरान विज़िटर पैटर्न को कार्यान्वित करना

void Accept(Visitor *); 

मैं यह पता लगाने की कैसे मैं एक ही इंटरफ़ेस (शून्य वापसी प्रकार के साथ उपयोग कर सकते हैं करने में असमर्थ हूँ:

अब, वस्तु पदानुक्रम में मैं एक निम्न हस्ताक्षर के साथ विधि स्वीकार करें (C++ का उपयोग करते हुए) को शामिल किया है) जबकि एक ही समय में मेरे ठोस तरीकों को विभिन्न रिटर्न प्रकारों की अनुमति देता है।

+0

आपको जो करना है, उसके बारे में बेहतर स्पष्टीकरण प्रदान करना चाहिए। * अलग-अलग रिटर्न प्रकार * से आपका क्या मतलब है? आगंतुक पैटर्न में, उचित कार्यान्वयन के साथ कार्य 'स्वीकार' नहीं बल्कि आगंतुक के अंदर कार्यान्वयन है .. –

उत्तर

14

टाइप पदानुक्रम में Accept विधि केवल एक प्रेषक है, और इसमें कोई वापसी प्रकार नहीं है। क्या आप चाहते हैं मुलाक़ात है एक मूल्य का उत्पादन करने का सबसे सरल तरीका है कि जोड़ने के लिए आगंतुक के राज्य के हिस्से के रूप में होगा:

struct times2 : visitor { 
    double value; 
    times2() : value() {} 
    void operator()(int x) { value = x * 2; } 
    void operator()(double x) { value = x * 2; } 
}; 

object o; 
times2 v; 
o.accept(v); 
std::cout << "Result is " << v.value << std::endl; 

फिर, आगंतुक के विशिष्ट विवरण के साथ अलग अलग होंगे आपके कार्यान्वयन, लेकिन विचार यह है कि आप वापसी के बजाय विज़िटर में परिणाम संग्रहीत कर सकते हैं।

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