কিভাবে একটি লাইব্রেরী ক্লাস কার্যকারিতা প্রসারিত?

এ সমস্যা

আমি ইউনিকোডে আমার প্রোজেক্টটি তৈরি করি কিন্তু ASCII- এ ফাইলটি পড়তে/লিখতে লিখতে CMYDoc :: Serialize() ফাংশন প্রয়োজন। সমস্যা হচ্ছে যে একবার ইউনিকোডে, ক্যাচারি ক্লাসটি স্বয়ংক্রিয়ভাবে ইউনিকোডের সমস্ত স্ট্রিংগুলি পড়তে/লিখতে পারে যা আমি চাই না।

আমার সমাধান

আমার সমাধানটি আমার নিজস্ব শ্রেণী <�কোড> ক্যাচারিএ থেকে ক্যাচারে পেয়েছে যা 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);


};

এখন আমি ডক এর ফাইল সিরিয়ালাইজ করা </কোড> ফাংশন এর মত কিছু করার আশা করছিলাম।

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.

প্রশ্ন

হয়তো আমি আজ শুধু কাঁটা ঝাঁকুনি অনুভব করছি কিন্তু কিভাবে আমি আমার নিজস্ব ডাইভেয়েটেড ক্লাস ক্যাচারিএক্যাচিভ রূপান্তর করতে পারি তাই আমি এর সাথে কাজ করতে পারি? যদি এটি ক্র্যাচয়েভ </কোড> থেকে প্রাপ্ত না হয় তবে এর চেয়ে ভাল কি আর সহায়ক ফাংশনগুলি লিখুন যা ক্যাচেভ প্রথম প্যারামিটার হিসাবে গ্রহণ করবে এবং ASCII স্ট্রিংগুলি লিখবে?

আমি একটি প্রদত্ত গ্রন্থাগার থেকে একটি বেস ক্লাস কার্যকারিতা প্রসারিত একটি আকর্ষণীয় কেস স্টাডিজ এটি খুঁজে। অবজেক্ট অব ইরিয়েন্টেড ডিজাইন খুঁজছেন যখন পাশাপাশি সমাধান এ যে দৃষ্টিভঙ্গি অন্বেষণ করতে চাই। আমার চিন্তা আমার ভাগ আছে, কিন্তু আপনি প্রথম শুনতে চান। এই অর্থে যে প্রশ্নটি হবে তার মত একটি সমস্যার সমাধান করার সর্বোত্তম উপায় কি হবে যখন (বলে) একটি লাইব্রেরী ক্লাস কার্যকরীতার একটি ক্ষুদ্র ক্ষুদ্র অংশে পতিত হচ্ছে? ধন্যবাদ।

0

1 উত্তর

আমি মনে করি এই কাজের জন্য উত্তরাধিকারের মত নিয়ন্ত্রণ একটি ভাল হাতিয়ার।

পাবলিক উত্তরাধিকারের মাধ্যমে, আপনি বলছেন যে ক্যাচারিএ হল - একটি ক্যাচেভ

এই সম্পর্ক ক্রমবর্ধমান নয়। এটি একটি অভিভাবক-সন্তানের সম্পর্কের সমতুল্য। সুতরাং, একটি ক্র্যাচয়েভ অবজেক্ট হয় না একটি ক্যাচিভএ বস্তু, এবং আপনি একটি carchiveA পয়েন্টের রেফারেন্স ব্যবহার করতে পারবেন না একটি <�কোড> ক্যাচেভ </কোড> বস্তুর কাছে

একটি ভাল পছন্দ হবে আপনার ক্যাচারিএ বর্গটি ক্র্যাচাইভ </কোড> বস্তুর চারপাশের একটি আচ্ছাদন তৈরি করতে এবং এর থেকে উত্তরাধিকারের পরিবর্তে এটি ধারণ করে। আপনি ক্যাচারিএ এর জন্য একটি কন্সট্রাকটরকে সংজ্ঞায়িত করতে পারেন যা carchive অবজেক্ট বা রেফারেন্সে থাকে এবং এটির একটি রেফারেন্স রাখে এবং তারপর আপনার ReadString/WriteString পদ্ধতি আপনি কি করতে চান।

যদি ক্যাচেভ কিছু বিমূর্ত ইন্টারফেস প্রয়োগ করে, তাহলে আপনি সেই কোডটি থেকেও carchiveA প্রাপ্ত করতে পারেন। কিন্তু যদি না হয়, আপনি সম্ভবত এই জন্য উত্তরাধিকার ব্যবহার করতে চান না।

0
যোগ
এটি একটি ভাল উপায় এটি করা। যখন আমি `CTestDoc :: Serialize (ক্র্যাচাইভ এ আর এআর) 'চেষ্টা করি তখন ফাংশনটি আর কাঠামো দ্বারা বলা হবে না, তাই এই কোডটি কি ক্যাচেভ না carchiveA
যোগ লেখক zar, উৎস