如何扩展库类的功能
How to extend functionality of a library class?
>问题
我用Unicode构建我的项目,但我需要CMyDoc::Serialize()函数来读取/写入ASCII中的文件(想想字符串)。问题是一旦进入Unicode,CArchive类会自动读取/写入Unicode中的所有字符串,这也是我不想要的。
我的解决方案
我的解决方案是从也支持 ASCII 字符串的 CArchive
派生我自己的类CArchiveA
。这是我的类定义。
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 字符串的帮助程序函数,会更好吗?
我发现这是一个有趣的案例研究,从给定库扩展基类的功能。我很想在寻找面向对象设计的同时在解决方案中探索这一方面。我有我的想法,但想先听你说。从这个意义上说,问题是,当(比如)库类的功能有点不足时,解决此类问题的最佳方法是什么?谢谢。
我认为对于这项工作来说,遏制是比继承更好的工具。
通过公共继承,您是在说CArchiveA
是CArchive
。
这种关系不是可交换的。 这类似于亲子关系。 因此,CArchive
对象不是CArchiveA
对象,并且不能使用 CArchiveA
引用指向CArchive
对象。
更好的选择是使CArchiveA
类成为CArchive
对象的包装器,并包含它而不是从它继承。 您可以为 CArchiveA
定义一个构造函数,该构造函数接受CArchive
对象或引用,并保留对它的引用,然后定义ReadString/WriteString
方法来执行所需的操作。
如果CArchive
实现了某个抽象接口,您可能还希望从中派生CArchiveA
。 但如果没有,您可能不想为此使用继承。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 为什么必须动态分配扩展数组才能使此功能正常工作C++
- 扩展基类并在不更改派生类的情况下使用该功能
- 扩展 Eigen::Vector2d 的功能
- C ;使用lambdas在类中有条件地扩展功能(MWE的SEG故障)
- 扩展 CRTP 模板功能
- 当我想扩展当前应用程序的功能时,出现DIAMOND情况
- 使用更新功能扩展QML图像类型
- C 功能参数扩展了多个类
- 包含开关的功能在C 中不扩展内联
- 扩展 std::p riority_queue 功能
- 在C++中扩展容器(如std::vector)功能的正确方法,而不从中继承
- 使用扩展功能在整个系统中搜索文件
- 有没有办法使用 c++ 和 wxwidget 实现类似于 wpf 扩展器的功能
- 如何扩展库类的功能
- 用于访问现有c++功能的node-ffi与node扩展
- 如何扩展Direct Connect客户端的功能(如linuxdcpp、dc++)
- 扩展std::chrono功能以处理运行时(非编译时)常量周期
- 扩展功能(又名修改)visual studio C/ c++编译器