【问题标题】:Add own function to ifstream将自己的函数添加到 ifstream
【发布时间】:2018-01-15 22:09:55
【问题描述】:

我希望自己的类在任何情况下都能像 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();
};

我发现了很多我不应该从 ifstream 继承的信息。那我怎样才能轻松解决我的问题呢?

编辑:

计算文件大小:

size_t ifile::calculate_file_size()
{
    auto present_pos = tellg();
    seekg(0, ifstream::end);
    auto file_size = tellg();
    seekg(present_pos);
    return file_size;
}
  1. 很高兴看到合适的例子(如果我可以从ifstream 继承)。
  2. 原因是计算一次,读取多次。
  3. 为什么不get_file_size(ifstream &amp;ifs)?我的 ifstream obj 是静态的,所以它被计算了很多次。

【问题讨论】:

  • 制作get_file_size(ifstream&amp; ifs) 总是一种选择,对吧?
  • 作为奖励,当统一的函数调用使其成为语言时,它将无缝工作。
  • 您可以编写一个包装类,其中包含一个ifstream 并授予对它的直接访问权限。然后,您可以在该包装器中提供您需要的功能。
  • 我不知道“我不应该从 ifstream 继承的信息”说什么,但是子类化 std::ifstream 并没有错。但与其他所有事情一样,这必须正确完成。

标签: c++ c++11 std fstream


【解决方案1】:

ifstream 继承以添加新方法非常好,这是一个code sample,在任何平台上都没有让我失望。但是,据我了解,std 类通常没有虚拟析构函数,在处理派生对象时需要注意这一点。因此,从它们中推导出新的错误可能性。

【讨论】:

  • 说“std 类没有虚拟析构函数”是不准确的。仅举一个例子,std::basic_streambuf 有。此外,“添加成员变量”也不相关。如果基类没有虚拟析构函数,则不要通过指向该基类的指针删除派生类型的对象。该规则不依赖于任一类型的内容。
  • @MSalters 所以除了这个非常合理的规则之外,通过指向基类的指针删除没有成员变量和自定义析构函数的派生类型对象是否可能产生不利影响?
  • 鉴于它是未定义的行为,不利影响可能包括鼻恶魔。在实践中,它取决于基类和派生类之间的确切差异。 C++ 委员会未能找到一套可行的规则来定义何时安全。仅给出struct Base { }struct Derived : Base { },通过Base* 删除Derived 对象在普通编译器上是安全的,当然在发布版本中也是如此。但是一个可行的规则需要涵盖非平凡的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
相关资源
最近更新 更多