【问题标题】:How can I override an C++ standard-library class function?如何覆盖 C++ 标准库类函数?
【发布时间】:2011-07-03 19:57:15
【问题描述】:
如何覆盖 C++ 标准库类函数?在我的应用程序中,我在许多不同的代码位置使用ofstream 对象。现在我想在 Linux Ubuntu 中以不同的权限模式打开文件。但是ofstream的open函数没有参数来指定它创建的文件的权限模式。
现在我想重写ofstream 类的open() 函数,这样它将获得一个参数来指定用户访问的权限。
【问题讨论】:
标签:
c++
inheritance
iostream
【解决方案1】:
首先,为了澄清您的术语,STL 通常指的是包含容器、迭代器和算法的 C++ 标准库的子集。流类是 C++ 标准库的一部分,但通常不与 STL 捆绑在一起。一些纯粹主义者会坚持认为 C++ 标准库中没有 STL 这样的东西(因为从技术上讲,STL 是一个被纳入标准的第三方库),但大多数 C++ 程序员都会明白你的意思。
至于您的问题,标准中无法使用ofstream 指定权限模式。如果您想创建自己的自定义流类,如 ofstream 但支持权限,您最好的选择是执行以下操作:
创建basic_streambuf 的子类,允许您在指定 Unix 权限的同时打开、写入和可能读取文件。流类的设计使得与物理设备(如磁盘、网络和控制台)通信的细节都由basic_streambuf 类及其派生类处理。如果您想创建自己的流类,那么实现流缓冲区将是一个很好的第一步。
定义您自己的子类basic_ostream 并安装您的自定义basic_streambuf。默认情况下,basic_ostream 通过根据底层basic_streambuf 对象实现它们来支持所有标准输出例程。一旦您拥有自己的流缓冲区,构建一个使用该streambuf 的basic_ostream 类将导致该类上的所有标准流操作(例如<<)开始对您的streambuf 进行适当的调用。
如果您想了解更多详细信息,请参考Standard C++ IOStreams and Locales。作为一个无耻的插件,我使用了本书中的技术来构建a stream class that wraps a socket connection。虽然我的流中的许多代码并不是特别有用,但基本结构应该可以帮助您入门。
希望这会有所帮助!
【解决方案2】:
这不是直接回答您的问题,因为我不建议覆盖 ofstream::open。
您不能使用this 帖子中的第一个建议吗?像往常一样打开文件以获得正确的权限,然后从文件描述符构造一个ofstream。
【解决方案3】:
#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;
}
似乎在这里工作。
【解决方案4】:
另一种选择是创建一个包含“ofstream”对象并具有所需接口的包装类,并将工作传递给它的“oftstream”成员。它看起来像这样。