2014-05-12 57 views
0

为什么在下面的代码中指令os->operator>> input错误?不是操作符的返回值>>对象* os?使用操作符>>带指向ifstream对象的指针

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

using namespace std; 

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

不要使用指向'ifstream's的指针!他们不打算这样使用。必要时可以通过参考传递。 – Rook

+0

@请问具体原因是什么? –

+1

@RoyIacob与任何其他对象一样,不应通过原始指针引用来使用,只要可以避免。 –

回答

1

如果你正在创建类似于流的指针,那么你可能做错了什么。

这应该很好地工作:

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

那么,这是答案的一半 –

+0

@MooingDuck哪一半? – Rook

+2

@Rook这一半并没有真正回答这个问题。 – 0x499602D2

4

当你想使用>>作为一种方法,那么你需要通过()来传递参数像正常功能。要取消对它的引用,你应该使用这两种方式:

os->operator >> (input); 

*os >> input; 

注:为什么指针时,你可以使用自动对象或引用。而且,你需要管理分配的对象并释放它。

相关问题