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

时间:2011-07-03 19:57:15

标签: c++ inheritance iostream

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

现在我想覆盖ofstream类的open()函数,以便它获取一个参数来指定用户访问权限。

4 个答案:

答案 0 :(得分: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的{​​{1}}类将导致该类的所有标准流操作(例如streambuf)开始进行适当的调用到你的<<

  3. 如果您想了解更多详细信息,可以参考Standard C++ IOStreams and Locales。作为一个无耻的插件,我使用了本书中的技术来构建a stream class that wraps a socket connection。虽然我的流中的很多代码都不是特别有用,但基本结构应该可以帮助你开始。

    希望这有帮助!

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

#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;
}

似乎在这里工作。

答案 3 :(得分:0)

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