पुस्तकालय वर्ग की कार्यक्षमता कैसे बढ़ाएं?

समस्या

मैं यूनिकोड में अपनी परियोजना का निर्माण करता हूं लेकिन मुझे ASCII में फ़ाइल पढ़ने (लिखने के तार) पढ़ने/लिखने के लिए सीएमडीओक :: सीरियलइज़() फ़ंक्शन की आवश्यकता है। समस्या यह है कि एक बार यूनिकोड में, कैक्रिव क्लास यूनिकोड में सभी तारों को स्वचालित रूप से पढ़/लिखता है, साथ ही मैं नहीं चाहता हूं।

मेरा समाधान

मेरा समाधान CArchiveA से मेरी अपनी कक्षा CArchiveA प्राप्त करता है जो ASCII स्ट्रिंग का भी समर्थन करता है। यहां मेरी कक्षा परिभाषा है।

class CArchiveA : public CArchive
{

public:
    CArchiveA(CFile* pFile,
                UINT nMode,
                int nBufSize = 4096,
                void* lpBuf = NULL);

    CArchiveA( CArchive & ar );

    virtual ~CArchiveA();

    BOOL ReadStringA(CStringA& rString);
    LPSTR ReadStringA(_Out_z_cap_(nMax+1) LPSTR lpsz, _In_ UINT nMax);

    void WriteStringA(LPCSTR lpsz);


};

अब मैं दस्तावेज़ की फ़ाइल Serialize फ़ंक्शन में ऐसा कुछ करने की उम्मीद कर रहा था।

void CTestDoc::Serialize(CArchive& ar)
{
    CArchiveA & ar_a ( ar );

   //text is of type CStringA

    if (ar.IsStoring())
    {
       //TODO: add storing code here
        ar_a.WriteStringA( text );
    }
    else
    {
       //TODO: add loading code here

        ar_a.ReadStringA( text );
    }
}

But the first line above CArchiveA & ar_a ( ar ); is compiler error.

प्रश्न

हो सकता है कि मैं आज सिर्फ तंग महसूस कर रहा हूं लेकिन मैं अपने कोड से CArchive को अपने स्वयं के व्युत्पन्न वर्ग CArchiveA में कैसे परिवर्तित कर सकता हूं ताकि मैं इसके साथ काम कर सकूं? क्या यह बेहतर है अगर मैं CArchive से प्राप्त नहीं करता हूं और इसके बजाय सहायक कार्यों को लिखता हूं जो पहले पैरामीटर के रूप में CArchive स्वीकार करेंगे और ASCII तारों को लिखेंगे?

मुझे यह किसी दिए गए लाइब्रेरी से बेस क्लास की कार्यक्षमता बढ़ाने का एक दिलचस्प केस अध्ययन मिलता है। ऑब्जेक्ट ओरिएंटेड डिज़ाइन की तलाश करते समय मुझे समाधान में उस पहलू का पता लगाना अच्छा लगेगा। मेरे पास विचारों का हिस्सा है, लेकिन आप पहले सुनना चाहते हैं। उस अर्थ में सवाल यह होगा कि इस तरह की समस्या को हल करने का सबसे अच्छा तरीका क्या है (कहें) लाइब्रेरी क्लास कार्यक्षमता की थोड़ी कम हो रही है? धन्यवाद।

0
जोड़ा संपादित
विचारों: 1

1 उत्तर

मुझे लगता है कि इस नौकरी के लिए विरासत की तुलना में रोकथाम एक बेहतर उपकरण है।

सार्वजनिक विरासत से, आप कह रहे हैं कि CArchiveA एक CArchive है।

यह रिश्ता कम्यूटिव नहीं है। यह माता-पिता-बच्चे के रिश्ते के समान है। इस प्रकार, एक crchive ऑब्जेक्ट CArchiveA ऑब्जेक्ट नहीं है नहीं है, और आप बिंदु के संदर्भ में CArchiveA संदर्भ का उपयोग नहीं कर सकते CArchive ऑब्जेक्ट पर।

CArchive ऑब्जेक्ट को CArchive ऑब्जेक्ट के आस-पास एक रैपर बनाने के लिए एक बेहतर विकल्प होगा, और इसे इसके उत्तराधिकारी के बजाय इसमें शामिल किया जाएगा। आप CArchiveA के लिए एक कन्स्ट्रक्टर को परिभाषित कर सकते हैं जो CArchive ऑब्जेक्ट या संदर्भ में लेता है, और इसके संदर्भ में रहता है, और फिर आपके ReadString/WriteString आप जो चाहते हैं उसे करने के तरीके।

यदि CArchive कुछ अमूर्त इंटरफ़ेस लागू करता है, तो आप उस से CArchiveA भी प्राप्त कर सकते हैं। लेकिन यदि नहीं, तो आप शायद इसके लिए विरासत का उपयोग नहीं करना चाहते हैं।

0
जोड़ा
इसे रखने का यह एक अच्छा तरीका है। जब मैंने `CTestDoc :: Serialize (CArchiveA & ar) 'की कोशिश की तो फ़ंक्शन को अब फ्रेमवर्क द्वारा नहीं कहा जाएगा, इसलिए यह कहता है कि CArchive CArchiveA नहीं है
जोड़ा लेखक zar, स्रोत