2 timruning timruning 于 2016.02.22 23:02 提问

getline能否接受自动类型转换?

这个代码getline接收参数有bug。
我不明白为啥FName1有类型转换函数,getline函数还是不能接受file对象呢,应该能够自动按照ifstream接收呀。
我试了print函数,里面有getline,接收的参数类型是ifstream&,是没有问题的。
本来以为编译器不接受函数参数多次类型转换,但自己试的代码也是没问题的(从一个类型利用operator转换到另一个类型,再转换为基类类型)

#include
#include
#include
using namespace std;
class FName1 {
ifstream file;
string fileName;
bool named;
public:
FName1() :named(false) {}
FName1(const string& fname)
:fileName(fname), file(fname.c_str()) {
named = true;
}
string name() const {
return fileName;
}
void name(const string& newName) {
if (named)
return;
fileName = newName;
named = true;
}
operator ifstream&() {
return this->file;
}
// ifstream& ifstreamobject(){
// return file;
// }
void close() {
file.close();
}
};
void print(ifstream& in) {
string s;
while (getline(in,s))
{
cout << s << endl;
}
return;
}
int main() {
FName1 file("out.dat");
cout << "file.name()" << endl;
string s;
while (getline(file, s)) {
cout << s << endl;
}
print(file);
file.close();
}

1个回答

John_ToStr
John_ToStr   Rxr 2016.02.23 12:01
已采纳

operator ifstream&() {
return this->file;
}
指的是将FName1 类转换为ifstream&类型, 因为file是本类中ifstream的一个对象;return 语句return this->file;刚好将其转换过来。
while (getline(file, s)) {
cout << s << endl;
}
大家百度会发现getline()的原型是istream& getline ( istream &is , string &str , char delim );其中 istream &is 表示一个输入流,
譬如cin;string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);char delim表示
遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停止读入)。由于file是FName1类型的
所以在getline(file, s)执行的时候,编译器隐式的将file转换成了ifstream&类型(通过调用operator ifstream&() ),这样不就参数匹配了嘛。

John_ToStr
John_ToStr 回复timruning: 那你就用file.operator ifstream&() ; 这样不就转了, 之前的说发我仅仅是根据你的结果推测的,我也没有测试, 求采纳...
接近 2 年之前 回复
timruning
timruning 谢谢回答。 可问题就在于这儿,我以为他会自动将file转换成ifstream&类型,可以main函数的getline是报错的。。。 while (getline(file, s)) { cout << s << endl; } 如果强制转换file类型为ifstream就没有问题了。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!