0

问题

我用 Unicode 构建我的项目,但我需要 CMyDoc::Serialize() 函数来读取/写入 ASCII 文件(认为字符串)。问题是,一旦在 Unicode 中,CArchive 类也会自动读取/写入 Unicode 中的所有字符串,这是我不想要的。

我的解决方案

我的解决方案是派生我自己的类CArchiveA,该类CArchive也支持 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 );
    }
}

但是上面的第一行CArchiveA & ar_a ( ar );是编译器错误。

问题

也许我今天感觉生疏了,但是我怎样才能转换CArchive成我自己的派生类CArchiveA,以便我可以使用它呢?如果我不派生CArchive而是编写将接受CArchive作为第一个参数并编写 ASCII 字符串的辅助函数会更好吗?

我发现这是一个从给定库扩展基类功能的有趣案例研究。在寻找面向对象设计的同时,我也很想探索解决方案中的这一方面。我有我的想法,但想先听听你的意见。从这个意义上说,问题是当(比如说)一个库类有点缺乏功能时,解决此类问题的最佳方法是什么?谢谢。

4

1 回答 1

1

对于这项工作,我认为遏制是比继承更好的工具。

通过公共继承,您说的是CArchiveAis-a CArchive

这种关系不是可交换的。这类似于亲子关系。因此,CArchive对象不是CArchiveA对象,您不能使用引用CArchiveA来指向CArchive对象。

更好的选择是让你的CArchiveA类成为对象的包装器CArchive,并包含它而不是从它继承。您可以为它定义一个构造函数,CArchiveA它接受一个CArchive对象或引用,并保留对它的引用,然后定义您的ReadString/WriteString方法来做您想做的事。

如果CArchive实现了一些抽象接口,您可能也希望从中派生CArchiveA。但如果不是,您可能不想为此使用继承。

于 2012-05-24T16:00:53.990 回答