问题
我用 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 字符串的辅助函数会更好吗?
我发现这是一个从给定库扩展基类功能的有趣案例研究。在寻找面向对象设计的同时,我也很想探索解决方案中的这一方面。我有我的想法,但想先听听你的意见。从这个意义上说,问题是当(比如说)一个库类有点缺乏功能时,解决此类问题的最佳方法是什么?谢谢。