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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++类的自动转换和强制类型转换
通过构造函数来转换 如果有这样的构造函数: Node(int _x); 则可以有这样的语句: Node a=2; 这条语句实际上将使用2作为构造函数的参数创建临时变量,然后将该变量复制到a中,由于这一步是自动进行的,所以称为隐式转换。注意只有一个参数的构造函数(或者有多个参数,但除了第一个,其他的参数都有默认值)才能用来转换。 可以用于隐式转换的情况(前提是有满足条件的构造函数):
数据类型自动转换的原理……
之前我讲了一下“一张搞定数据类型”,里面谈到了数据类型的自动转换,那么为什么范围小的会自动向范围大的转换呢,今天看了传智播客苏坤老师讲的c#语言基础,讲到了这个原理,觉得顿悟了…… 如图,int(表示的范围小)为何能向double(表示范围大)自动转换呢??? 因为int本来表示的范围就不如double表示的大,并且int表示范围内的所有整数均包含于double范围集中,所以int向d
springMVC类型转换和数据绑定
public String method(Integer num, Date birth) { ... }Http请求传递的数据都是字符串String类型的,上面这个方法在Controller中定义,如果该方法对应的地址接收到浏览器的请求的话,并且请求中含有num和birth参数,那么num会被自动转换成Integer对象;birth会被自动转为Date对象(Date转换需要配置属性编辑器)。
各种字符读取方法的比较(cin,getline等)
读取一个字符或一个字符串的方法有很多,也有些陷阱,下面总结一下。   (1)>>操作符 >>操作符的重载,有很多种原型,能够从输入流抽取各种形式的输入(int、单个字符、字符串等),也是我们最常用的一种读取字符的方式。它需要配合输入流对象使用(cin就是iostream类中的istream类对象静态成员),并且返回值是输入流的引用,所以能够有cin>>a>>b这样的写法。
VC6.0 中 getline(cin, string) 需按两次回车解决方法,getiline输入时的用法
症状:  c++的标准库模板函数getline在读到限定符后还要读取额外字符...  解决方法:进入X:\Program Files\Microsoft Visual Studio\VC98\Include目录(VC6.0安装的地方),用记事本打开string(注意,不是string.h), 然后找到以下代码段.  else if (_Tr::eq((_E)_C,_D)) {_C
关于C++的getline换行符的问题
例如     string s;     char a;     cin>>a;     cout     getline(cin,s);     cout 当输入num之后就直接输出a的值了, 并不能输入s。 而当我们输入aaa bbb的时候,输出的结果是 a aa bbb.        这是因为stdin是缓冲式输入,必须在输入换行后才读入num.但是它只把第一个字
浅谈cin>>与cin.getline读取缓冲区中的‘\n’和空格的区别
发现一个有趣的问题,先看代码: #include #include //getchar() using namespace std; int main() { int n; char test[100]; cin >> n; getchar();//1# cin.getline(test, 11);//2# //cin >> test;//3
关于getline()的实验 getline()会读取留缓存区的换行符导致直接换行
getline()会读取留缓存区的换行符导致直接换行
关于c++中getline(cin,str)在cin之后使用
int main() {     string str;     int a;     cin>>a;     cin.ignore();     getline(cin,str);     cout     return 0; } getline(cin,str)的读取原理是将以‘/n’为结束符做为一完整读取的一行,'/n'会读。所以当之前用cin读取一个字符的时候,你会
C++中使用cin之后再使用getline出问题的解决办法!
今天做OJ的时候,发现一个问题,就是我使用cin>>T;之后zai