2012-12-14 21 views
5

मैं एक काउंटर इंटरफ़ेस है कि सभी व्युत्पन्न वर्ग बलों बनाने के लिए इस इंटरफ़ेस को लागू करने की कोशिश कर रहा हूँ:अधिभावी शुद्ध आभासी ऑपरेटरों

class CounterInterface 
{ 
public: 
    virtual CounterInterface& operator ++() = 0; 
    virtual CounterInterface operator ++ (int) = 0; 
    virtual CounterInterface& operator --() = 0; 
    virtual CounterInterface operator -- (int) = 0; 
    virtual bool operator == (const CounterInterface o) const = 0; 
    virtual operator uint32_t() const = 0; 
    virtual void reset() = 0; 
}; 

हालांकि, सिर्फ नीचे त्रुटि में इस वर्ग परिभाषा परिणाम भी शामिल है।

दुर्भाग्यवश पोस्ट इंक को संदर्भ के रूप में परिभाषित नहीं किया जा सकता है।

कोई भी विचार इस चिकन/अंडे की समस्या को हल करने के लिए कैसे करें?

CounterInterface.h:25:29: error: invalid abstract return type for member function ‘virtual libceis::CounterInterface libceis::CounterInterface::operator++()’ 
CounterInterface.h:22:8: note: because the following virtual functions are pure within ‘libceis::CounterInterface’: 
CounterInterface.h:25:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator++() 
CounterInterface.h:26:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator++(int) 
CounterInterface.h:27:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator--() 
CounterInterface.h:28:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator--(int) 
CounterInterface.h:29:17: note: virtual bool libceis::CounterInterface::operator==(libceis::CounterInterface) const 
CounterInterface.h:30:12: note: virtual libceis::CounterInterface::operator uint32_t() const 
CounterInterface.h:31:17: note: virtual void libceis::CounterInterface::reset() 
CounterInterface.h:26:29: error: invalid abstract return type for member function ‘virtual libceis::CounterInterface libceis::CounterInterface::operator++(int)’ 

उत्तर

2

आप शुद्ध आभासी सदस्य कार्यों के साथ कक्षा को तुरंत चालू नहीं कर सकते हैं। जब से तुम उन्हें नहीं बना सकते, तो आप भी उन्हें मूल्य से लौट सकते हैं नहीं, जैसा कि आप

में क्या
virtual CounterInterface operator ++ (int) = 0; 
virtual CounterInterface operator -- (int) = 0; 
1

सबसे पहले आप

virtual bool operator == (const CounterInterface o) const = 0; 

दूसरे स्थान ले लेंगे द्वारा

virtual bool operator == (const CounterInterface &o) const = 0; 

, एक ही चीज जो 'ओलाफ डायत्शे' कहती है, यह मेरे से तेज थी :-)

5

आप भाग्य से बाहर हैं। आप उस ऑब्जेक्ट के गतिशील प्रकार के साथ एक मान वापस करना चाहते हैं। आप नहीं कर सकते: (+ गैर-पॉइंटर) मान C++ में मान कोवर्तनीय रिटर्न प्रकार नहीं हो सकते हैं क्योंकि C++ में वापसी-दर-मान में इसके स्थिर प्रकार से भिन्न गतिशील प्रकार नहीं हो सकता है।

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

आप डिज़ाइन पर विस्तार कर सकते हैं। CounterInterface के उदाहरण के लिए एक (स्मार्ट) पॉइंटर रखने वाली कक्षा लिखें। इस प्रकार को मूल्य से वापस किया जा सकता है और इसलिए आप जो इंटरफ़ेस चाहते हैं उसे कार्यान्वित कर सकते हैं। यह शुद्ध वर्चुअल फ़ंक्शन CounterInterface *clone() (या unique_ptr<CounterInterface> clone()) को कॉल करके ऐसा कर सकता है जो इंटरफ़ेस लागू करने वाले ठोस वर्ग का एक नया उदाहरण आवंटित करता है और देता है। ऑपरेटरों कि आभासी कार्यों के रूप में काम करते हैं, तो आप उन्हें CounterInterface पर छोड़ सकते हैं और अपने आवरण वर्ग के माध्यम से कॉल कर सकते हैं, या आप वर्चुअल इंटरफ़ेस में उनका नाम बदल कर सकते हैं:

class Counter { 
    unique_ptr<CounterInterface> ctr; 
    public: 
    Counter(unique_ptr<CounterInterface> c) : ctr(std::move(c)) {} 
    Counter(CounterInterface *c) : ctr(c) {} 
    Counter &operator++() { 
     ctr->increment(); // or ++(*ctr) 
     return *this; 
    } 
    Counter operator++(int) { 
     Counter ret(ctr->clone()); 
     ctr->increment(); 
     return ret; 
    } 
    operator uint32_t() const { 
     return *ctr; 
    } 
    void reset() { 
     return ctr->reset(); 
    } 
}; 

वर्चुअल operator== एक पूरी अलग समस्या है जो मैं साइट पर अन्य सवालों के लिए छोड़ देंगे।

बीटीडब्ल्यू, CounterInterface को आभासी विनाशक की आवश्यकता है।

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