सी ++ सार वर्ग ऑपरेटर ओवरलोडिंग और इंटरफ़ेस प्रवर्तन सवाल
हैलो सभी, (मूल पोस्ट से संपादित "BaseMessage" से "स्थिरांक BaseMessage &" बदलने के लिए) मैं बहुत सी के ++ नया हूँ, इसलिए मैं आप लोगों को आशा है कि मेरी मदद कर सकते हैं "मेरे तरीकों की त्रुटियों को देखें"।
मेरे पास संदेशों का पदानुक्रम है, और मैं को एक इंटरफेस को लागू करने के लिए एक सार आधार वर्ग का उपयोग करने की कोशिश कर रहा हूं। विशेष रूप से, मैं प्रत्येक व्युत्पन्न संदेश को ओवरलोडेड < < ऑपरेटर प्रदान करने के लिए मजबूर करना चाहता हूं।
जब मैं कुछ इस तरह के साथ ऐसा करने का प्रयास करें:
class BaseMessage
{
public:
// some non-pure virtual function declarations
// some pure virtual function declarations
virtual ostream& operator<<(ostream& stream, const BaseMessage& objectArg) = 0;
}
संकलक शिकायत है कि
"त्रुटि: पैरामीटर 'objectArg' की घोषणा नहीं कर सकते हैं सार प्रकार की होनी चाहिए 'BaseMessage'
मेरा मानना है कि यहां "मित्र" मुद्दे भी शामिल हैं, लेकिन जब मैंने इसे घोषित करने की कोशिश की:
virtual friend ostream& operator<<(ostream& stream, const BaseMessage objectArg) = 0;
संकलक एक अतिरिक्त त्रुटि जोड़ा
"त्रुटि: आभासी कार्यों मित्र नहीं हो सकता"
वहाँ सुनिश्चित करने के लिए है कि मेरे व्युत्पन्न (संदेश) कक्षाओं के सभी एक "< <" ostream ऑपरेटर प्रदान एक रास्ता है ?
धन्यवाद बहुत,
स्टीव
निलोलाई का जवाब जो आप पूरा करने की कोशिश कर रहे हैं उसके लिए सबसे अच्छा समाधान है। हालांकि, आपको जो विशिष्ट त्रुटि मिल रही थी वह इसलिए है क्योंकि आप आधार द्वारा बेसमेसेज ऑब्जेक्ट को पास करने का प्रयास कर रहे हैं (आपके वर्चुअल ऑपरेटर के लिए दूसरा तर्क <<)। यह काम नहीं कर सकता क्योंकि बेसमेसेज में एक शुद्ध वर्चुअल फ़ंक्शन (वही वर्चुअल ऑपरेटर <<) शामिल है, इसलिए मूल्य से गुजरने के लिए बेसमेसेज का उदाहरण बनाना संभव नहीं है। ध्यान दें कि ऑपरेटर के निलोलाई का संस्करण << संदर्भ द्वारा अपना दूसरा तर्क लेता है (यह बेस से प्राप्त कुछ वर्ग होगा)। –