timruning 2016-02-22 15:02 采纳率: 50%
浏览 1295
已采纳

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条回答 默认 最新

  • 关注

    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&() ),这样不就参数匹配了嘛。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)