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不会空手而归。