2009-10-25 19 views
10

पिंपल बहुत सारे C++ कोड में बॉयलरप्लेट का स्रोत हैं। वे इस तरह की चीज की तरह लगते हैं कि मैक्रोज़, टेम्पलेट्स और शायद थोड़ी बाहरी उपकरण सहायता का संयोजन हल हो सकता है, लेकिन मुझे यकीन नहीं है कि सबसे आसान तरीका क्या होगा। I've seen templates जो कुछ उठाने में मदद करता है लेकिन ज्यादा नहीं - आपको अभी भी कक्षा के हर तरीके के लिए अग्रेषण कार्यों को लिखने की आवश्यकता है जिसे आप लपेटने की कोशिश कर रहे हैं। क्या कोई आसान तरीका है?सी ++ कक्षाओं के स्वचालित पंपलिंग - क्या कोई आसान तरीका है?

मैं मेक प्रक्रिया के हिस्से के रूप में उपयोग किए जाने वाले टूल की कल्पना कर रहा हूं। आप चाहते हैं कि आपके पब्लिक हेडर कक्षाओं को पंपल करें, ताकि आप कुछ इनपुट फ़ाइल प्रदान कर सकें, pimpl.in कहें, जो कक्षाओं को लागू करता है (जिसे अन-पिंपल किया गया है) जिसे आप लपेटना चाहते हैं, फिर उस फ़ाइल की जांच की जाती है, पिंपल कक्षाएं उत्पन्न होती हैं और केवल 'हेड इंस्टॉल' के दौरान उनके शीर्षलेख (मूल वर्ग के शीर्षलेख नहीं) स्थापित होते हैं। समस्या यह है कि मुझे बिना किसी फ्लाइंग सी ++ पार्सर के ऐसा करने का कोई तरीका नहीं दिखता है, कुछ संकलक विक्रेता भी सही नहीं हो सकते हैं। हो सकता है कि कक्षाएं किसी भी तरह से लिखी जा सकें जो बाहरी उपकरण का काम आसान बनाती है, लेकिन मुझे यकीन है कि मैं सभी प्रकार के कोने के मामलों (जैसे टेम्पलेटेड क्लास और/या टेम्पलेटेड सदस्य फ़ंक्शंस) खोना समाप्त कर दूंगा।

कोई विचार? क्या कोई और इस समस्या के समाधान के साथ पहले से आया है?

class ClassA { 
    virtual void foo() = 0; 
    static ClassA *create(); 
}; 

// in ClassA.cpp 

class ImplA : public ClassA { 
/* ... */ 
}; 
ClassA *ClassA::create() { 
    return new ImplA(); 
} 

हालांकि यह vtable समारोह संकेत प्राप्त करते समय से भूमि के ऊपर जोड़ता है:

+0

लेज़ी सी ++ कुछ ऐसा ही – Amnon

उत्तर

6

नहीं, कोई आसान जवाब नहीं है। :-(मैं लगभग हर OO विशेषज्ञ कह "विरासत से अधिक रचना पसंद करते हैं", रचना एक पूरी बहुत कुछ विरासत की तुलना में आसान बनाने के लिए भाषा का समर्थन नहीं होगा के साथ लगता होगा।

0

एक विकल्प एक अंतरफलक वर्ग के बजाय का उपयोग करें।

इसके अलावा, मैं इस तरह के किसी भी उपकरण के बारे में नहीं सोच सकता। जैसा कि आपने कहा था, सी ++ पार्सिंग गैर-तुच्छ है, और वहां अन्य भाषाएं हैं जहां यह एक समस्या से कम है (उदाहरण के लिए, सी # या जावा देर से सब कुछ बांधें, ताकि आप बिना किसी समस्या के अपने इन-मेमोरी लेआउट को बदल सकें)।

+4

सी # सबसे निश्चित नहीं "देर बाँध सब कुछ" –

2

मैं नहीं कह रहा हूँ यह अच्छा है (बस कुछ ऐसा है जो sprang मन में)
लेकिन आप ऑपरेटर ओवरलोडिंग के साथ प्रयोग कर सकते हैं -।।>

#include <memory> 
#include <iostream> 

class X 
{ 
    public: 
    void plop() 
    { 
     std::cout << "Plop\n"; 
    } 
}; 

class PimplX 
{ 
    public: 
     PimplX() 
     { 
      pimpl.reset(new X); 
     } 
     X* operator->() 
     { 
      return pimpl.get(); 
     } 
    private: 
     PimplX(PimplX const&); 
     PimplX& operator=(PimplX const&); 
     std::auto_ptr<X> pimpl; 
}; 


int main() 
{  
    PimplX  x; 

    x->plop(); 
} 
+0

एक दिलचस्प विचार है कि, हालांकि आप करेंगे। अभी भी एक एक्स ऑब्जेक्ट पर फ़ंक्शंस कॉल करना समाप्त करें, जिसका अर्थ है कि आपको एक्स के शीर्षलेख और परिभाषा का पर्दाफाश करने की आवश्यकता होगी, इसलिए एक्स नहीं होगा पूरी तरह से अपारदर्शी। दूसरी तरफ, यदि आप मुख्य रूप से एबीआई के लिए पिंपलिंग कर रहे हैं और कक्षा अपारदर्शी नहीं बना रहे हैं (और उपयोगकर्ताओं पर भरोसा कर सकते हैं कि इसके शीर्षलेख उपलब्ध होने पर सीधे एक्स का उपयोग करने का विकल्प नहीं होगा), मुझे लगता है कि यह ठीक रहेगा। –

+0

इसके अलावा, सी ++ में कक्षा परिभाषाओं के अंदर परिभाषित कार्य अंतर्निहित रूप से इनलाइन हैं। X के एबीआई को कॉलर को टाई नहीं करने के लिए आपको कक्षा के बाहर पिंपप्लेक्स के कन्स्ट्रक्टर और ऑपरेटर-> परिभाषाओं को स्थानांतरित करने की आवश्यकता होगी। –

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