Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何扩展库类的功能?

如何扩展库类的功能?
EN

Stack Overflow用户
提问于 2012-05-24 07:51:59
回答 1查看 519关注 0票数 0

问题

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

我的解决方案

我的解决方案是从CArchive派生我自己的类CArchive,它也支持ASCII字符串。这是我的班级定义。

代码语言:javascript
运行
AI代码解释
复制
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函数中执行类似的操作。

代码语言:javascript
运行
AI代码解释
复制
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字符串的助手函数,情况会更好吗?

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

EN

回答 1

Stack Overflow用户

发布于 2012-05-24 08:00:53

我认为对于这项工作来说,包容比继承更好。

通过公共继承,您是说CArchiveA是-一个CArchive

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10740961

复制
相关文章
Python excel 功能扩展库 —
说明:本文档内容参考自 https://www.cnblogs.com/zeke-python-road/p/8986318.html (作者:关关雎鸠`)的文档
py3study
2020/01/17
4520
CodeGPT:具有类ChatGPT功能的VSCode扩展
大数据文摘授权转载自数据派THU 作者:The PyCoach 翻译:陈之炎 校对:赵鉴开 我并非VSCode的忠实粉丝,但不得不承认,它比我每天使用的代码编辑器有更多有用的扩展。 其中一个扩展是CodeGPT。这个扩展允许我们通过官方的OpenAI API在VSCode中调用GPT-3,如同在代码编辑器中有了ChatGPT一样! 使用CodeGPT可以生成代码、解释代码、重构代码等等。让我们来看看如何设置它,并探索它的全部功能。 在VSCode上设置CodeGPT 要安装这个扩展,必须打开VSCode
大数据文摘
2023/04/10
1.2K0
CodeGPT:具有类ChatGPT功能的VSCode扩展
通过 Trait 水平扩展 PHP 类功能
从 PHP 5.4 开始,引入了一种新的代码复用方式 —— Trait,Trait 其实也是一种通过组合水平扩展类功能的机制,我们在 php_learning/oop 目录下新建一个 trait.php 来存放本篇教程的代码,然后基于 Trait 定义动力源,Trait 结构通过关键字 trait 定义:
学院君
2020/07/21
1.2K0
通过 Trait 水平扩展 PHP 类功能
独家 | CodeGPT:具有类ChatGPT功能的VSCode扩展
作者:The PyCoach‍翻译:陈之炎校对:赵鉴开 本文约1300字,建议阅读7分钟本文为你介绍在VSCode中使用GPT-3的官方OpenAI API。 用Canva制作图片 我并非VSCode的忠实粉丝,但不得不承认,它比我每天使用的代码编辑器有更多有用的扩展。 其中一个扩展是CodeGPT。这个扩展允许我们通过官方的OpenAI API在VSCode中调用GPT-3,如同在代码编辑器中有了ChatGPT一样! 使用CodeGPT可以生成代码、解释代码、重构代码等等。让我们来看看如何设置它,并探索
数据派THU
2023/04/08
2.7K0
独家 | CodeGPT:具有类ChatGPT功能的VSCode扩展
通过对象组合水平扩展 PHP 类功能
通过前面的学习,我们已经知道,通过类继承可以扩展类的功能,但是随着系统越来越复杂,如果仅仅通过类继承的方式扩展类的功能,而 PHP 又是单继承机制,会导致类的层级越来越深,系统也会随之变得越来越臃肿,而且新增子类来扩展功能这种方式本身也不太灵活,子类和父类相互绑定,改变父类方法会影响子类的行为,这也会让系统的可维护性大大降低。
学院君
2020/07/21
1.4K0
通过对象组合水平扩展 PHP 类功能
[其它 Other] ci数据库工具类扩展
ci的数据库工具类、没有获取数据表列表等等的方法。在这里做了个扩展。主要用于做数据中心管理的。
CrazyCodes
2018/09/18
7840
ThinkPHP6.0 扩展类库目录(extend)
假设在 extend 目录下创建一个 Upload.php 文件,如果是 extend 目录的直接子内容则不需要添加命名空间
很酷的站长
2023/02/18
1.6K0
ThinkPHP6.0 扩展类库目录(extend)
uitextfield扩展类可修改placeholder的颜色  (扩展类)
[_tfdUserName setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
conanma
2021/05/11
1.1K0
如何扩展VS2017未安装的功能
我们在使用VS2017时,由于VS2017该ide功能过于强大,使用范围涵盖多个领域,我们在安装VS2017时很多时候只需要安装自己需要的某部分的功能即可,这个步骤在软件安装过程中有过,该步骤让我们勾选自己需要的功能。
CherishTheYouth
2019/09/12
1.5K0
如何扩展VS2017未安装的功能
数据库层如何扩展?
这样看来,似乎只要加几个数据库,共同分担来自应用层的流量就完成了从单库到多库的扩展:
ayqy贾杰
2020/03/12
1.1K0
如何加载第三方类库/项目类库/基类库?
如果你的类库没有使用命名空间定义的话,实例化的时候需要加上根命名空间,官方文档原话
PM吃瓜
2019/08/13
1.3K0
Redis的Lua的功能扩展
Redis支持使用Lua脚步来进行功能扩展,这个能力给Redis带来了更多的应用场景,你可以编写若干命令组合,作为一个小型的非阻塞事务或者更新逻辑 使用脚本的好处 1更快 Redis应用的使用方式很多都是 read-compute-write 模式,这需要客户端与服务端进行两次或者多次通信,而如果把中间的compute过程转移到服务端执行,则可以大幅地减少round-trip时间 2减少网络开销 将多个请求通过脚本的形式一次发送,减少网络时延 3原子操作 redis会将整个脚本作为一个整体执行,中间不会
dys
2018/04/03
8880
聊聊如何基于eureka元数据扩展namespace功能
最近朋友部门接手供方微服务项目过来运维,那套微服务的技术栈是springcloud Netflix,和朋友部门的微服务技术栈刚好匹配。当时朋友部门的想法,既然都是同一套技术体系,那些基础服务治理组件比如注册中心之类,就共用同一套。然而在落地实施的过程中,发现供方提供的微服务项目服务有些serviceId和朋友部门他们已有服务serviceId名字竟然一模一样。这样就有问题了,eureka服务发现是通过serviceId识别
lyb-geek
2023/02/27
3030
聊聊如何基于eureka元数据扩展namespace功能
聊聊如何基于eureka元数据扩展namespace功能
最近朋友部门接手供方微服务项目过来运维,那套微服务的技术栈是springcloud Netflix,和朋友部门的微服务技术栈刚好匹配。当时朋友部门的想法,既然都是同一套技术体系,那些基础服务治理组件比如注册中心之类,就共用同一套。然而在落地实施的过程中,发现供方提供的微服务项目服务有些serviceId和朋友部门他们已有服务serviceId名字竟然一模一样。这样就有问题了,eureka服务发现是通过serviceId识别
lyb-geek
2023/02/21
3990
聊聊如何基于eureka元数据扩展namespace功能
库中是如何实现string类的?
需要注意的是,如果采用无参构造,刚开始容量是0. 这就导致是初次扩容,容量开始是0,所以这里要判断扩容前,容量是否是0,再考虑1.5倍或者二倍扩容.
初阶牛
2023/10/14
1850
库中是如何实现string类的?
Emacs 扩展 Evil 功能
今天在修改代码的过程中,发现有一些地方,想使用多光标来修改,但是在使用的时候,感觉不太会用 evil mc ,中间切换到了 multiple-cursors 包上,但是在 evil 模式下使用,因为模式切换的情况,修改代码的时候会弹出一些奇怪的提示,因为模式的切换的问题,所以又换到了 evil-mc 上。
zucchiniy
2020/05/22
1.7K0
Spark强大的函数扩展功能
在数据分析领域中,没有人能预见所有的数据运算,以至于将它们都内置好,一切准备完好,用户只需要考虑用,万事大吉。扩展性是一个平台的生存之本,一个封闭的平台如何能够拥抱变化?在对数据进行分析时,无论是算法也好,分析逻辑也罢,最好的重用单位自然还是:函数。 故而,对于一个大数据处理平台而言,倘若不能支持函数的扩展,确乎是不可想象的。Spark首先是一个开源框架,当我们发现一些函数具有通用的性质,自然可以考虑contribute给社区,直接加入到Spark的源代码中。 我们欣喜地看到随着Spark版本的演化,确实涌
张逸
2018/03/07
2.2K0
mybatis-plus的扩展功能
在我们的开发中 数据的创建时间 ,修改时间 !这些操作都是自动更新的 不需要我们手动操作
暴躁的程序猿
2022/03/23
3110
mybatis-plus的扩展功能
数据库设计采用行扩展,实现系统设置功能
在我们开发的系统功能中,大部分都有设置功能,比如APP端的用户推送开关设置,平时我们是这样设计的:
用户7741497
2022/03/24
4220
点击加载更多

相似问题

如何扩展类的功能?

33

如何扩展基类功能

20

如何实现扩展类的功能?

44

安全地扩展标准库类的功能

20

可扩展的类div功能

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文