- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
几天前,我决定编写一个使用mmap
和预读的streambuf
子类会很有趣。我查看了我的 STL (SGI) 如何实现 filebuf
并意识到 basic_filebuf
包含一个 FILE*
。所以从 basic_filebuf
继承是不可能的。
所以我继承自basic_streambuf
。然后我想将我的 mmapbuf
绑定(bind)到一个 fstream。
我认为我唯一要做的就是复制 filebuf
的隐式接口(interface)...但这是一个明显的错误。在 SGI 中,basic_fstream
拥有一个 basic_filebuf
。无论我是否调用 basic_filestream.std:::::ios::rdbuf( streambuf* )
,文件流都会完全忽略它并使用它自己的 filebuf
。
所以现在我有点困惑...当然,我可以创建自己的 mmfstream
,这将是 fstream
的精确复制/粘贴,但是听起来真的不是面向 DRY。
我不明白的是:为什么 fstream
与 filebuf
如此紧密地结合在一起,以至于除了filebuf
? 将流和缓冲区分开的全部意义在于可以使用具有不同缓冲区的流。
解决方案:
=> filestream
应该依赖于filebuf
的隐式接口(interface)。也就是说,fstream 应该由 streambuf 类模板化。这将允许每个人向 fstream
提供自己的 streambuf 子类,只要它实现了 filebuf
的隐式接口(interface)。问题:我们不能将模板参数添加到 fstream
,因为它会在使用 fstream
作为模板模板参数时破坏模板选择器。
=> filebuf
应该是一个没有任何附加属性的纯虚类。这样就可以从它继承而无需携带它的所有 FILE* 垃圾。
你对这个主题的看法?
最佳答案
在 IO 流的设计中,大多数实际流的功能(相对于流缓冲区的功能)是在 std::basic_istream
中实现的,std::basic_ostream
,以及它们的基类。 字符串和文件流类或多或少只是方便的包装器,可确保实例化具有正确缓冲区类型的流。
如果您想扩展流,您几乎总是想提供您自己的流缓冲区类,而且您几乎永远不需要提供自己的流类。 .
一旦你有了自己的流缓冲区类型,你就可以将它作为你碰巧拥有的任何流对象的缓冲区。或者您从 std::basic_istream
、std::basic_ostream
和 std::basic_iostream
派生您自己的类,它们实例化您的流缓冲区并通过它到他们的基类。
后者对用户来说更方便,但需要您为缓冲区的实例化编写一些样板代码(即流类的构造函数)。
回答您的问题:文件流和文件缓冲区耦合得如此紧密,因为前者的存在只是为了简化后者的创建。使用文件流可以轻松进行所有设置。
使用您自己的流类来包装您自己的流缓冲区的构造应该不是问题,因为无论如何您都不应该传递文件流,而只是(引用)基类。
关于c++ - 从 streambuf 派生而不重写相应的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989537/
我有一个无法理解的奇怪编译问题。 //I know, you should never derive from the STL Library template class SharedClass :
我是一个刚开始学习 Haskell 的菜鸟,所以如果我问愚蠢的问题,请耐心等待。 最近我在 SO 中遇到了演示如何导出函数和表达式的类型和实现的问题(诸如 How can I understand "
如何自动派生此 GADT 的 Read 实例: {-# LANGUAGE GADTs, StandaloneDeriving #-} data TypeDec a where TypeDecInt
我遇到了我想要的情况 Deal class要注意它DealDetail type反之亦然,我想 DealDetail注意Deal type .将来我想有很多 Deal 的后代和 DealDetails
我是 C# 新手,所以请多多包涵。 好的,所以我在不同的程序集中有两个类需要相互引用: namespace AssemblyA { class A { private B MyB {
简而言之,我已经实现了一个派生自 SynchronizationContext 的类,以便 GUI 应用程序可以轻松地使用在 GUI 线程以外的线程上引发的事件。我非常感谢对我的实现的评论。具体来说,
我正在设计一个小型系统,想知道如何为派生类分配内存的细微差别。 如果我有两个类(class) class foo { public: int a; Foo(): a(0) {}; }; class
我正在尝试编写一个派生 PartialEq 的枚举,其中包含一个手动执行此操作的特征对象。我使用了解决方案 here为了强制 Trait 的实现者编写相等方法。这无法编译: trait Trait {
以下代码可以编译(特别是 MyError 被识别为具有调试特性): use std::str; use std::fmt; #[derive(Debug)] enum MyError where F:
是否有一种简单的方法来注释结构中的字段,以便在派生 PartialEq 特征时忽略它们?例如: #[derive(PartialEq,Eq)] pub struct UndirectedGraph {
我正在编写代码来处理“Foo”类型的对象。 foo 是一种容器,为了提供对其元素的高效和抽象访问,它提供了 Element 类型的嵌套类。 Element 包装对象在容器中的位置。 现在,“Foo”可
假设如下: class child : public parent { public: fun1(parent * obj); //somewhere on the child class
我有几个模板类 template class Transition { public: virtual Cost getCost() = 0; }; template class St
我正在尝试使用自定义 QSortFilterProxyModel . 这是我的标题: #include class QSortFilterProxyModel_NumbersLast : publi
我正在使用 C# 和 mvc3。我在解决方案中添加了一个项目。我想创建一个新 Controller 并让它从我添加的项目中的 Controller 派生。我该怎么做? 最佳答案 在 Visual St
我在 python 中有一个对象,它派生自 QtGui.QGraphicsPixmapItem,具有一些基本属性和方法。在对此对象的引用上调用 deepcopy 后,当我尝试使用该副本时收到一条错误消
由于只能给FixedDocument添加页面,所以我写了一个派生类: public class CustomFixedDocument : FixedDocument { public voi
我在自定义 QMainWindow 时遇到了很大的问题,因为我不知道如何实现以下内容: 在 QMainWindow 文档中,QMainWindow 有一些用于工具栏、停靠小部件、状态栏和其他的特殊区域
我想感受一下QT,决定写一个小的十六进制编辑器。为此,我需要一个允许滚动的小部件。经过一番研究,我发现 QTextEdit 为此目的派生自 QAbstractScrollArea。在阅读 QAbstr
我正在寻找一种可以从已经发生的洗牌过程中派生出 key 的算法。 假设我们有被打乱的字符串“Hello”: "hello" -> "loelh" 现在我想从中导出一个 key k,我可以用它来撤销洗牌
我是一名优秀的程序员,十分优秀!