2010-03-17 6 views
5

मैं स्थानीय वर्ग के रूप में कुछ फ़ंक्शन (विधि) के भीतर इंटरफ़ेस को लागू करने पर विचार कर रहा हूं।एक स्थानीय वर्ग के रूप में सार वर्ग लागू करें? कुछ कारणों से पेशेवरों और विपक्ष

निम्नलिखित पर विचार करें:

class A{ 
public: 

    virtual void MethodToOverride() = 0; 

}; 

A * GetPtrToAImplementation(){ 

    class B : public A { 
    public: 
     B(){} 
     ~B(){} 

     void MethodToOverride() { 
      //do something 
     } 
    }; 

    return static_cast<A *>(new B()); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    A * aInst = GetPtrToAImplementation(); 

    aInst->MethodToOverride(); 

    delete aInst; 
    return 0; 
} 

कारण मैं यह कर रहा हूँ कर रहे हैं:

  1. मैं अलग फ़ाइलों
  2. MethodToOverride सिर्फ प्रतिनिधियों फोन में वर्ग (बी) को लागू करने के आलसी हूँ अन्य कक्षा
  3. कक्षा बी अन्य उपयोगकर्ताओं को दिखाई नहीं देनी चाहिए
  4. अब चिंता करने की कोई आवश्यकता नहीं है एआईएनटी को हटाने से पहले स्मार्ट पॉइंटर्स का उपयोग वास्तविक कार्यान्वयन में किया जाता है

तो मेरा सवाल यह है कि अगर मैं यह सही कर रहा हूं?

अग्रिम धन्यवाद!

+0

आप 'ए' के लिए कार्यान्वयन फ़ाइल में' बी 'पूरी तरह से (गैर-स्थानीय) को परिभाषित क्यों नहीं कर सकते? –

+1

बस एक नाइटपिक है, लेकिन ए में आभासी विनाशक होना चाहिए – jpalecek

+0

ए केवल एक इंटरफेस है - एक हेडर फ़ाइल में घोषित किया गया है। साथ ही, बी अनुवाद इकाई के बाहर दिखाई नहीं दे सकता है जहां GetPtrToAIplementation परिभाषित किया गया है। – sinek

उत्तर

5
  1. आप कार्यान्वयन फ़ाइल जहां GetPtrToAImplementation() लागू की अनाम नाम स्थान में B निर्धारित कर सकते हैं।

  2. A में वर्चुअल डॉटोर होना चाहिए।

  3. वर्तमान सी ++ मानक से, आप स्थानीय वर्गों को टेम्पलेट तर्क के रूप में उपयोग नहीं कर सकते हैं। (जिसका अर्थ है कि आप उन्हें एसटीएल के साथ उपयोग नहीं कर सकते हैं, उदाहरण के लिए।)

+0

@ एसबीआई: ऐसा लगता है कि मेरे लिए आराम करने का समय है क्योंकि मुझे अनाम नामों को याद नहीं किया जा सकता :) :) पेज। जानकारी के लिए धन्यवाद कि उन्हें टेम्पलेट तर्क के रूप में उपयोग नहीं किया जा सकता क्योंकि मुझे यह नहीं पता था! – sinek