如何覆盖C ++标准库类函数?在我的应用程序中,我在许多不同的代码位置使用ofstream
个对象。现在我想在Linux,Ubuntu中以不同的权限模式打开文件。但open
的{{1}}函数没有参数来指定其创建的文件的权限模式。
现在我想覆盖ofstream
类的open()
函数,以便它获取一个参数来指定用户访问权限。
答案 0 :(得分:5)
首先,为了澄清您的术语,STL通常是指包含容器,迭代器和算法的C ++标准库的子集。流类是C ++标准库的一部分,但通常不与STL捆绑在一起。一些纯粹主义者会坚持认为C ++标准库中不存在STL(因为从技术上讲,STL是标准中采用的第三方库),但大多数C ++程序员都知道你的意思。
至于您的问题,标准中无法指定ofstream
的权限模式。如果您想创建自己的自定义流类,如ofstream
但支持权限,那么您最好的选择是执行以下操作:
创建basic_streambuf
的子类,允许您在指定Unix权限时打开,写入和可能读取文件。设计流类是为了使与磁盘,网络和控制台等物理设备通信的细节全部由basic_streambuf
类及其派生类处理。如果你想创建自己的流类,实现流缓冲区将是一个很好的第一步。
定义您自己的子类basic_ostream
并安装自定义basic_streambuf
。默认情况下,basic_ostream
通过基础basic_streambuf
对象实现它们来支持所有标准输出例程。拥有自己的流缓冲区后,构建使用该basic_ostream
的{{1}}类将导致该类的所有标准流操作(例如streambuf
)开始进行适当的调用到你的<<
。
如果您想了解更多详细信息,可以参考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'成员。它看起来像这样。