मेरे पास एक जटिल श्रेणी पदानुक्रम है जिसमें कक्षाएं एक-दूसरे के आधार पर क्रॉस-जैसी हैं: दो अमूर्त कक्षाएं ए और सी में एक विधि है जो क्रमशः सी और ए का उदाहरण देता है। विरासत में कक्षाओं में मैं एक सह-प्रकार का उपयोग करना चाहता हूं, जो इस मामले में एक समस्या है क्योंकि मुझे विरासत संबंध जहाज को आगे बढ़ाने का तरीका नहीं पता है।सी ++: मैं बिना किसी कास्टिंग के विरासत में कक्षाओं में "अवैध कॉन्वेंट रिटर्न प्रकार" से कैसे बच सकता हूं?
मुझे एक "test.cpp: 22: त्रुटि प्राप्त होती है: 'वर्चुअल डी * बी :: आउटसी()' के लिए अमान्य कॉन्वर्सट रिटर्न टाइप" - त्रुटि क्योंकि संकलक को पता नहीं है कि डी सी
का उप-वर्ग हैclass C;
class A {
public:
virtual C* outC() = 0;
};
class C {
public:
virtual A* outA() = 0;
};
class D;
class B : public A {
public:
D* outC();
};
class D : public C {
public:
B* outA();
};
D* B::outC() {
return new D();
}
B* D::outA() {
return new B();
}
यदि मैं वापसी प्रकार बी :: आउटसी() से सी * को उदाहरण संकलित करता हूं। बी * और डी * को विरासत कक्षाओं में रिटर्न प्रकार के रूप में रखने का कोई तरीका है (यह मेरे लिए सहज होगा कि एक तरीका है)?
क्या आपको वास्तव में उस प्रकार की उलझन की आवश्यकता है? (इसे युग्मन करना थोड़ा छोटा हो सकता है) –
कभी-कभी यह भाषा की समस्या नहीं है, यह जिस तरह से हम इसका उपयोग करने की कोशिश करते हैं, उसमें एक समस्या है। यदि आपके दो पदानुक्रम इतने गहरे युग्मित हैं, तो मुझे लगता है कि आप एक पदानुक्रम के साथ बेहतर होंगे ('सी' और 'बी' के साथ 'बी' के साथ 'ए' को फ्यूज करना) क्योंकि ऐसा लगता है कि वे एक दूसरे के बिना काम नहीं कर सकते । –
ठीक है, मेरे पास दो प्रकार के वर्ग हैं: एक कार्य और निष्पादक के लिए एक विनिर्देश जो वास्तव में कार्य निष्पादित करता है (कई धागे लॉन्च करता है)। विनिर्देश स्वयं कार्य के लिए एक कारखाना होना चाहिए और प्रत्येक निष्पादक को इसके विनिर्देश तक पहुंचने की आवश्यकता है। और उनके कार्यों के साथ विभिन्न विनिर्देश हैं। तो निष्पादक एक विनिर्देश लपेटता है, इसलिए युग्मन केवल एक दिशा में मजबूत होता है, दूसरी दिशा में यह केवल फैक्ट्री-विधि है। – Searles