我试图理解这句话:
int main() {
fstream inf( "ex.txt", ios::in );
char c;
while( inf >> c ) {
cout << c << ", ";
}
return 0;
}
(inf >> c
)在上面的while循环中返回什么?我下载了gcc源代码并尝试使用它,但这对我来说太复杂了:(。
我检查了C ++参考页面,我意识到它会返回对自身的引用:
istream& operator>> (bool& val );
istream& operator>> (short& val );
istream& operator>> (unsigned short& val );
istream& operator>> (int& val );
istream& operator>> (unsigned int& val );
istream& operator>> (long& val );
istream& operator>> (unsigned long& val );
istream& operator>> (float& val );
istream& operator>> (double& val );
istream& operator>> (long double& val );
istream& operator>> (void*& val );
istream& operator>> (streambuf* sb );
istream& operator>> (istream& ( *pf )(istream&));
istream& operator>> (ios& ( *pf )(ios&));
istream& operator>> (ios_base& ( *pf )(ios_base&));
*** the following functions are not members but GLOBAL functions:
istream& operator>> (istream& is, char& ch );
istream& operator>> (istream& is, signed char& ch );
istream& operator>> (istream& is, unsigned char& ch );
istream& operator>> (istream& is, char* str );
istream& operator>> (istream& is, signed char* str );
istream& operator>> (istream& is, unsigned char* str );
所以我创建了一个类似的类,让我们说my_istream:
struct my_istream {
my_istream& self_ref;
};
int main() {
my_istream mis;
}
编译时,我收到了这个错误:
1>c:\users\chan\documents\visual studio 2010\projects\topcoder\topcoder\main.cpp(26): error C2758: 'my_istream::self_ref' : must be initialized in constructor base/member initializer list
但是,我真的不知道在这种情况下应该将self_ref初始化为什么?在处理链表时我理解了一个指向自身的指针,我理解C ++中的引用(&
)只是C语言中伪装的指针形式。但是我无法解释这种情况? istream
的内部实施如何实际运作?如何将引用评估为真或假?谢谢!
修改
struct my_istream {
my_istream() {
}
my_istream& operator >>( int x ) {
return *this;
}
};
int main() {
my_istream mis;
int x;
while( mis.operator>>( x ) ) {
cout << "--";
}
}
我应该在my_istream类中添加什么才能在while循环中工作?
答案 0 :(得分:2)
要返回自我引用,您只需return *this
。您实际上并未声明内部自引用。您可以拥有引用成员,但您必须在构造函数初始化列表中初始化它们:class Foo { Foo(int& some_int_ref) :my_ref_member(some_int_ref)
istream有另一个重载来确定它的布尔值。
可链接成员的示例(如operator >>
,但在这种情况下只是一个普通的函数)并给一个类一个布尔值(尽管后者是一个值得它自己主题的复杂主题):
#include <iostream>
class X {
bool B;
public:
X() :B(false) { }
X& toggle() { B = !B; return *this; }
operator void*() { return B ? this : 0; }
};
int main()
{
X x;
x.toggle().toggle().toggle();
if (x)
std::cout << "true!" << std::endl;
}
编辑:我不想在这个答案中深入研究operator bool
vs operator void *
,但是这个旧的stackoverflow问题应该会给你很好的参考:Why is "operator bool()" invoked when I cast to "long"?
答案 1 :(得分:1)
(inf&gt;&gt; c)在上面的while循环中返回什么?
void*
。循环测试解析为while (inf.operator void*() != NULL)
。
如何将引用评估为true或false?
但支持转换为bool或可转换为bool的东西。
istream的内部实现如何实际起作用?
它只返回对自身的引用(return *this
),因此它可以支持链接。