问题
我用Unicode构建了我的项目,但是我需要CMyDoc::序列化()函数在ASCII中读取/写入文件(想想字符串)。问题是,一旦在Unicode中,CArchive类也会自动读取/写入Unicode中的所有字符串,这是我不想要的。
我的解决方案
我的解决方案是从CArchive
派生我自己的类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字符串的助手函数,情况会更好吗?
我发现这是从给定库扩展基类功能的一个有趣的案例研究。在寻找面向对象设计()的同时,我也希望在解决方案中探索这个方面。我有我的想法,但想先听你说。在这个意义上的问题是,当库类有点功能不足时,解决这样一个问题的最佳方法是什么?谢谢。
发布于 2012-05-24 08:00:53
我认为对于这项工作来说,包容比继承更好。
通过公共继承,您是说CArchiveA
是-一个CArchive
。
这种关系是不可交换的。这类似于父子关系。因此,CArchive
对象不是CArchiveA
对象,您不能使用CArchiveA
引用指向CArchive
对象。
更好的选择是使CArchiveA
类成为CArchive
对象的包装器,并包含它,而不是继承它。您可以为CArchiveA
定义一个构造函数,该构造函数接受一个CArchive
对象或引用,并保留对它的引用,然后定义您的ReadString/WriteString
方法来执行您想做的事情。
如果CArchive
实现了一些抽象接口,那么您也可能希望从中派生出CArchiveA
。但如果不是,您可能不想为此使用继承。
https://stackoverflow.com/questions/10740961
复制相似问题