如何覆盖C++标准库类函数?

kor*_*han 8 c++ inheritance iostream

如何覆盖C++标准库类函数?在我的应用程序中,我ofstream在许多不同的代码位置使用对象.现在我想在Linux,Ubuntu中以不同的权限模式打开文件.但是没有参数的open功能ofstream指定它创建的文件的权限模式.

现在我想覆盖类的open()功能,ofstream因此它将获得一个参数来指定用户访问的权限.

tem*_*def 5

首先,为了阐明您的术语,STL通常是指包含容器,迭代器和算法的C++标准库的子集.流类是C++标准库的一部分,但通常不与STL捆绑在一起.一些纯粹主义者会坚持认为C++标准库中不存在STL(因为从技术上讲,STL是标准中采用的第三方库),但大多数C++程序员都知道你的意思.

至于你的问题,标准中没有办法指定权限模式ofstream.如果您想创建自己的类似ofstream但支持权限的自定义流类,最好的办法是执行以下操作:

  1. 创建一个子类basic_streambuf,允许您在指定Unix权限时打开,写入和可能读取文件.流类的设计使得与磁盘,网络和控制台等物理设备通信的细节都由basic_streambuf类及其派生类处理.如果您想创建自己的流类,实现流缓冲区将是一个很好的第一步.

  2. 定义您自己的类,该类是子类basic_ostream并安装您的自定义basic_streambuf.默认情况下,它basic_ostream通过在底层basic_streambuf对象方面实现它们来支持所有标准输出例程.一旦拥有了自己的流缓冲区,构建一个basic_ostream使用该缓冲区的类streambuf将导致该类上的所有标准流操作(例如<<)开始对您的类进行适当的调用streambuf.

如果您想了解更多详情,可以参考标准C++ IOStreams和Locales.作为一个无耻的插件,我使用本书中的技术来构建一个包装套接字连接的流类.虽然我的流中的很多代码都不是特别有用,但基本结构应该可以帮助您入门.

希望这可以帮助!


use*_*653 1

这并没有直接回答你的问题,因为我不建议重写ofstream::open.

相反,您不能使用本文中的第一个建议吗?像平常一样打开文件以获得正确的权限,然后ofstream从文件描述符构造 .