timruning
timruning
采纳率50%
2016-02-22 15:02 阅读 1.3k

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_ToDebug 2016-02-23 04: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&() ),这样不就参数匹配了嘛。

    点赞 1 评论 复制链接分享

相关推荐