【问题标题】:Using operator>> with a pointer to ifstream object将 operator>> 与指向 ifstream 对象的指针一起使用
【发布时间】:2014-05-12 16:29:12
【问题描述】:

为什么下面代码中的指令os->operator>> input是错误的? operator>>的返回值不就是对象*os吗?

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
  double input;
  ifstream * os = new ifstream("prova.dat");
  os->operator>> input;
  return 0;
}

【问题讨论】:

  • 不要使用指向ifstreams 的指针!它们不打算以这种方式使用。它们可以在必要时通过引用传递。
  • @Rook 具体是什么原因?
  • @RoyIacob 与任何其他对象相同,只要可以避免,不应通过原始指针引用使用。
  • 抱歉,我以为input 是一个字符串。 os-&gt;operator&gt;&gt;(input)*os &gt;&gt; input 都可以。
  • @RoyIacob:标准类都经过精心编写,以处理它们自己的资源创建和清理。通过在堆上创建它们,您将失去它们为您提供的所有良好的 RAII 设施,您必须承担自己的清理责任,并且其他各种事情变得更难做。我想不出这样做有什么好处。

标签: c++ pointers operators ifstream


【解决方案1】:

当您想使用&gt;&gt; 作为方法时,您需要像普通函数一样通过() 传递参数。要取消引用它,您应该使用以下两种方式:

os->operator >> (input);

*os >> input;

注意:为什么是指针,什么时候可以使用自动对象或引用。此外,您需要管理分配的对象并释放它。

【讨论】:

    【解决方案2】:

    如果您要创建指向此类流的指针,您可能做错了什么。

    这应该可以正常工作:

    int main()
    {
      double input;
      std::ifstream os("prova.dat");
      os >> input;
      return 0;
    }
    

    因为ifstream是在栈上分配的,所以函数结束时会自动清理,从而关闭底层文件句柄。你错过了明确的delete,你需要在你的代码中做同样的事情。

    如果您需要传递您的流,您可以通过引用来实现:

    double read_double(std::ifstream& stream)
    {
      double d;
      stream >> d;
      return d;
    }
    
    int main()
    {
      std::ifstream os("prova.dat");
      double input = read_double(os);
      return 0;
    }
    

    【讨论】:

    • 好吧,这只是一个答案
    • @MooingDuck 哪一半?
    • @Rook 没有真正回答问题的那一半。
    • 对,但我认为他正在寻找解释为什么他的代码不起作用。告诉他推荐的方法还是不错的。
    • 很公平。 MM至少把那一点都盖好了,所以OP不会空手而归。
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多