我们知道迷人的类iostream太强大了。 它已超越插入运算符“<<”采取许多数据类型: ostream的和放;运算符(ostream&,int), ostream的和放; operator(ostream&,char)......
我们无法实例化ostream:ostream print; 因为ostream因为它的大部分CTORS都是“受保护的社交”(无法从外部访问)。
我们可以调用的唯一构造函数是ostream(streambuf *),它接受指向另一个类对象的指针(类streambuf);
我只想搞砸这堂课:
#include <ostream>
using namespace std;
int operator << (ostream& out, int* x)
{
out << "invoked!" << endl;
cout << *x; // works well!
cout << x; // normally works well and it prints the address that x points to but instead the program get in infinite loop or crushes!
return *x;
}
int main()
{
system("color 1f");
int* pVal = new int(57);
cout << *pVal << endl;
int* pX = new int(7);
cout << *pX << endl;
cout << *pVal << ", " << *pX << endl;
//cout << pVal << endl; // this doesn't work because my operator returns
//int and not a reference to ostream.
// and it is equal to: 0 << endl; which generates the same error
cout << pVal; // this works
// cout << endl << endl << endl;
return 0;
}
我重载了插入运算符,将左值作为对ostream对象的引用,将指向int的指针作为右值,我在函数中弹出一条消息,以确保它被调用。
请注意,我故意将其重载为返回int值,以便没有人可以写:
out << pInt << *pInt << endl;
......但只是:
out << pInt;
正如您在上面的内联注释中所看到的那样,我的问题是虽然cout << x
通常效果很好,但程序会进入无限循环或粉碎!
return *x;
任何人都可以解释我收到错误的原因吗?
答案 0 :(得分:1)
问题很明显,因为如果你只是cout << x
,它会一遍又一遍地调用你的重载函数。它永远不会回来。
这是解决方案(将x转换为void *)
int operator << (ostream& out, int* x)
{
out << "invoked!" << endl;
cout << *x; // works well!
cout << (void*)x;
return *x;
}