将自己的功能添加到ifstream

S.R*_*S.R 5 c++ fstream std c++11

我想让我自己的类在任何情况下都与ifstream完全一样,但我可以很容易地得到一个文件的大小.

这是标题:

#include <fstream>

using namespace std;

class ifile: public ifstream {

    size_t _file_size = 0;
    size_t calculate_file_size();
public:
    ifile(): ifstream(), _file_size(0) {}
    ifile(const char *filename, ios_base::open_mode mode = ios_base::in):
        ifstream(filename, mode)
    {
        _file_size = cal_file_size();
    }
    size_t get_file_size();
    virtual ~ifile();
};
Run Code Online (Sandbox Code Playgroud)

我发现了许多我不应该从ifstream继承的信息.那我怎么能轻松解决我的问题呢?

编辑:

calculate_file_size:

size_t ifile::calculate_file_size()
{
    auto present_pos = tellg();
    seekg(0, ifstream::end);
    auto file_size = tellg();
    seekg(present_pos);
    return file_size;
}
Run Code Online (Sandbox Code Playgroud)
  1. 很高兴看到正确的例子(如果我可以继承ifstream).
  2. 原因是计算一次并多次读数.
  3. 为什么不get_file_size(ifstream &ifs)呢?我的ifstream obj是静态的,因此它的计算次数很多.

ypn*_*nos 0

ifstream继承并添加新方法是完全可以的,这是一个在任何平台上都从未让我失望的代码示例。然而,据我了解,这些std类通常没有虚拟析构函数,在处理派生对象时需要注意这一点。因此,从它们中衍生出来会创造新的犯错误的可能性。

  • 说“std 类没有虚拟析构函数”是不准确的。仅举一例,`std::basic_streambuf` 有。此外,“添加成员变量”也不相关。如果基类没有虚拟析构函数,则不要通过指向该基类的指针删除派生类型的对象。该规则不依赖于任一类型的内容。 (2认同)
  • 鉴于它是未定义的行为,不良影响可能包括鼻恶魔。实际上,这取决于基类和派生类之间的确切区别。C++ 委员会未能找到一套可行的规则来定义何时是安全的。仅给出“struct Base { }”和“struct Derived : Base { }”,通过“Base*”删除“Derived”对象在普通编译器上是安全的,尤其是在发布版本中。但可行的规则需要涵盖重要的情况。 (2认同)