Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用运算符>&燃气轮机;使用指向ifstream对象的指针_C++_Pointers_Operators_Ifstream - Fatal编程技术网

C++ 使用运算符>&燃气轮机;使用指向ifstream对象的指针

C++ 使用运算符>&燃气轮机;使用指向ifstream对象的指针,c++,pointers,operators,ifstream,C++,Pointers,Operators,Ifstream,为什么以下代码中的指令os->operator>>输入错误?运算符>>的返回值不是对象*os吗 #include <iostream> #include <string> #include <fstream> using namespace std; int main() { double input; ifstream * os = new ifstream("prova.dat"); os->operator>> inpu

为什么以下代码中的指令
os->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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
双输入;
ifstream*os=新的ifstream(“prova.dat”);
操作系统->操作员>>输入;
返回0;
}

如果您正在创建指向这样的流的指针,那么您可能做错了什么

这应该很好:

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;
}

如果您正在创建指向这样的流的指针,那么您可能做错了什么

这应该很好:

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;
}

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

os->operator >> (input);


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

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

os->operator >> (input);



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

不要使用指向
ifstream
s的指针!他们不打算这样使用。它们可以在必要时通过引用传递。@Rook具体原因是什么?@RoyIacob与任何其他对象相同,只要可以避免,就不应该通过原始指针引用使用。对不起,我以为
input
是一个字符串。无论是
os->operator>>(input)
还是
*os>>input
都可以工作。@RoyIacob:标准类都是非常仔细地编写的,以处理它们自己的资源创建和清理。通过在堆上创建它们,您将失去它们提供给您的所有优秀RAII设施,您必须自行承担清理责任,其他各种事情也变得更加困难。我想不出做这件事有什么好处。不要使用指向
ifstream
s的指针!他们不打算这样使用。它们可以在必要时通过引用传递。@Rook具体原因是什么?@RoyIacob与任何其他对象相同,只要可以避免,就不应该通过原始指针引用使用。对不起,我以为
input
是一个字符串。无论是
os->operator>>(input)
还是
*os>>input
都可以工作。@RoyIacob:标准类都是非常仔细地编写的,以处理它们自己的资源创建和清理。通过在堆上创建它们,您将失去它们提供给您的所有优秀RAII设施,您必须自行承担清理责任,其他各种事情也变得更加困难。我想不出做这件事有什么好处。好吧,那是半个小时answer@MooingDuck哪一半?@Rook这一半并没有真正回答问题。是的,但我认为他在寻找一个解释,解释为什么他的代码不起作用。不过,告诉他推荐的方法仍然很好,这很公平。嗯,至少这一点已经被覆盖了,所以行动不会空手而归。好吧,那是半个小时answer@MooingDuck哪一半?@Rook这一半并没有真正回答问题。是的,但我认为他在寻找一个解释,解释为什么他的代码不起作用。不过,告诉他推荐的方法仍然很好,这很公平。嗯,至少这一点已经涵盖,所以OP不会空手而归。