2012-07-10 22 views
10

कोड स्निपेट नीचे एक त्रुटि पैदा करता है:सी ++ सार वर्ग पैरामीटर त्रुटि वैकल्पिक हल

#include <iostream> 

using namespace std; 

class A 
{ 

public: 

    virtual void print() = 0; 
}; 

void test(A x) // ERROR: Abstract class cannot be a parameter type 
{ 
    cout << "Hello" << endl; 
} 

वहाँ अन्य इस त्रुटि के लिए एक समाधान/वैकल्पिक हल है/

virtual void print() = { } 
साथ

virtual void print() = 0; 

की जगह की तुलना में बेहतर

संपादित करें: मैं मूल वर्ग ए को पॉली का उपयोग करके पैरामीटर के रूप में विस्तार/कार्यान्वित करने में सक्षम होना चाहता हूं morphism (यानी A* x = new B() ; test(x);)

चीयर्स

+0

परिभाषा के अनुसार एबस्टारक्ट क्लास को स्वयं ही तत्काल नहीं किया जाना चाहिए। व्युत्पन्न कक्षाओं द्वारा इसे विधियों को ओवरराइड करने की आवश्यकता है। बस उत्सुक, आप ऐसा करके क्या हासिल करने की कोशिश कर रहे हैं? – Mahesh

+1

मैं ए एक्स = नया बी() जैसे कुछ करना चाहता हूं और विस्तारित/कार्यान्वित करने वाले किसी वर्ग को पास करना चाहता हूं। मुझे लगता है कि मुझे लगता है कि प्रश्न बेहतर है। – Cemre

+1

समाधान/समाधान के साथ आने की कोशिश करने से पहले हमें समस्या को समझने की आवश्यकता है। "मूल्य द्वारा" पैरामीटर के रूप में एक अमूर्त वर्ग को पारित करने का विचार कोई समझ नहीं आता है। तुम क्या करने की कोशिश कर रहे हो? – AnT

उत्तर

20

चूंकि आप एक अमूर्त वर्ग को तुरंत चालू नहीं कर सकते हैं, मूल्य से एक को पास करना लगभग निश्चित रूप से एक त्रुटि है; के साथ लगभग अप्रत्याशित (एक बुरी तरह से) परिणाम हो करने के लिए गारंटी है,

void test(A& x) ... 

या

void test(A* x) ... 

मूल्य द्वारा पासिंग object slicing में परिणाम होगा, तो: क्या आप सूचक द्वारा या संदर्भ द्वारा इसे पारित करने की जरूरत है संकलक इसे एक त्रुटि के रूप में ध्वजांकित करता है।

+1

मैं कहूंगा कि यह निश्चित रूप से गारंटीकृत है। –

+0

@ लचियनग्रिगोर आप सही हैं, स्लाइसिंग हमेशा घटित होगी, भले ही कोई अतिरिक्त डेटा सदस्य स्लाइस बंद न हो, क्योंकि Vtable बेस क्लास के "कटा हुआ" होगा। – dasblinkenlight

3
बेशक

, हस्ताक्षर बदलने के लिए:

void test(A& x) 
//or 
void test(const A& x) 
//or 
void test(A* x) 

कारण अपने संस्करण में काम नहीं करता है, क्योंकि प्रकार A का एक उद्देश्य तार्किक मतलब नहीं है। यह सार है। संदर्भ या पॉइंटर पास करना इस के आसपास जाता है क्योंकि वास्तविक पैरामीटर के रूप में पारित प्रकार A नहीं है, लेकिन A (व्युत्पन्न कंक्रीट क्लास) का एक कार्यान्वयन वर्ग है।