派生std :: ofstream和重载运算符<<

时间:2018-06-05 15:30:26

标签: c++ inheritance std

如何从std :: ofstream类派生,在写入文件之前添加一些动作? 换句话说,替换像

这样的代码
int main()
{
   std::ofstream file("file.txt");
   file << "something" << std::endl;
   return 0;
}

通过

class MyFile : public std::ofstream
{
   MyFile(std::string filename) : std::ofstream(filename) {}

   ??? operator<< ???   <-- HERE1
   {
      // 1. do some stuff with the input
      // 2. if wanted,
      // flush it to the base class operator<<
   }
};

class MyFileC
{
private:
   std::ofstream intern_os;
public:
   MyFileC(std::string filename) : intern_os(filename) {}

   MyFileC& operator<<( input ???   <-- HERE2  )
   {


          // 1. do some stuff with the input
          // e.g (a) IF the input is a std::string,
          // THEN, if it contains "signal",
          // OnSignal();
          // or (b) if file size is too big, clear it ...
          // 2. Flush it (for all possible types):

      intern_os << input;
   }
};

int main()
{
    MyFile file("file2.txt"); // (or with MyFileC)
    file << "something" << std::endl;
    return 0;
}

我们可以在写作之前进行即时过滤等。

??? 行中放入什么来享受所有现有的std :: ofstream.operator&lt;&lt;(),请加上我们的个人添加内容?

  • HERE1 :更优雅,有继承方法; 或者如果不可能(在下面的评论之后),
  • HERE2 :传递给什么类型&#34;无论传递给内部std :: ofstream&#34; (字符串,整数,......)

1 个答案:

答案 0 :(得分:1)

operator<<不打算被派生的流类覆盖。相反,您应该覆盖std::basic_streambuf::overflow和/或std::basic_streambuf::xsputn

只要缓冲区溢出,就会在内部调用

overflow。如果要提供自己的缓冲,可以通过在重写的流类中通过std::basic_streambuf::setp初始化流指针来完成此操作。链接附带了如何执行此操作的示例。

这里只有一个美容问题:这些都是缓冲区方法。您要覆盖std::fstream,这是类,而不是buffer class。因此,您需要做的是双重的:

  1. 如上所述覆盖std::basic_filebuf
  2. 使用std::fstream::rdbuf将文件流对象的关联缓冲区设置为已覆盖的文件缓冲区类的实例。您可以在现有std::fstream的实例上或在该类型的自定义子类上执行此操作。