C ++ ostream<<超载问题

时间:2016-02-15 00:10:21

标签: c++ iostream

我们知道迷人的类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;

任何人都可以解释我收到错误的原因吗?

1 个答案:

答案 0 :(得分:1)

问题很明显,因为如果你只是cout << x,它会一遍又一遍地调用你的重载函数。它永远不会回来。

这是解决方案(将x转换为void *)

int operator << (ostream& out, int* x)
{
    out << "invoked!" << endl;
    cout << *x; // works well!
    cout << (void*)x;
    return *x;
}