如何重写c++标准库类函数

How can I override an C++ standard-library class function?

本文关键字:c++ 标准 类函数 重写 何重写      更新时间:2023-10-16

如何重写c++标准库类函数?在我的应用程序中,我在代码的许多不同位置使用ofstream对象。现在我想在Linux中以另一种权限模式打开文件,Ubuntu。但是ofstreamopen函数没有参数来指定它创建的文件的权限模式。

现在我想重写ofstream类的open()函数,这样它就会得到一个参数来指定用户访问的权限。

对于初学者,为了澄清术语,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对象实现所有标准输出例程来支持它们。一旦你有了自己的流缓冲区,构建一个使用streambufbasic_ostream类将导致该类(如<<)上的所有标准流操作开始适当调用streambuf

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

希望这对你有帮助!

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

你就不能使用这篇文章中的第一个建议吗?像往常一样打开文件以获得正确的权限,然后从文件描述符构造一个ofstream

#include <iostream>
#include <fstream>
class gstream: public std::ofstream
{
void open(const std::string& filename, ios_base::openmode mode,int stuff)
        {
                //put stuff here
        }
};
int main() {
        gstream test;
//io stuff
return 0;
}

另一个选择是创建一个包含'ofstream'对象并具有所需接口的包装器类,并将工作传递给它的'ofstream'成员。它看起来是这样的