使用cout链接时的C ++ ostringstream奇怪行为

时间:2013-06-03 20:03:42

标签: c++ ostringstream

我是C ++初学者(来自Java)。我有以下代码:

//#include <boost/algorithm/string.hpp>
#include <iostream>
#include <math.h>
#include <vector>
#include <string.h>
#include <string>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <memory>
#include <assert.h>
#include <cctype>

using namespace std;

class Point{
private:
    int x;
    int y;
public:
    Point(int x,int y){
        this->x=x;
        this->y=y;
    }

    int getX(){
        return x;
    }

    int getY(){
        return y;
    }

    operator const char*(){
        return toString().c_str();
    }

    string toString(){
        ostringstream stream;
        stream<<"( "<<x<<", "<<y<<" )";
        return stream.str();
    }
};


class Line{
private:
    Point p1=Point(0,0);
    Point p2=Point(0,0);

public:
    Line(Point p1, Point p2){
        this->p1=p1;
        this->p2=p2;
    }

    Point getP1(){
        return p1;
    }

    Point getP2(){
        return p2;
    }

    operator const char*(){
        ostringstream stream;
        stream<<"[ "<<p1<<" -> "<<p2<<" ]";
        return stream.str().c_str();
    }

    //    operator const char*(){
    //        ostringstream stream;
    //        stream<<"[ "<<p1<<" -> ";
    //        stream<<p2<<" ]";
    //        return stream.str().c_str();
    //    }
};

int main()
{

    Line line=Line(Point(1,2), Point(3,4));
    cout<<line<<endl;


    cout<<"\nProgram exited successfully."<<endl;
    return 0;
}

我重新定义了运算符const *,以便我可以使用cout&lt;

但是,如果我现在运行程序,第二个块被注释掉(我有2个版本的操作符const *,默认情况下第二个被注释掉),它将显示< / p>

[(1,2) - &gt; (1,2)]

但是当第二个块取消注释运行时,输出是预期的:

[(1,2) - &gt; (3,4)]

当我在同一行显示两个Point对象时出现问题(某种链接,但我不知道链接是否是正确的词)

我的问题是,为什么会发生这种情况?

更新

我添加了std :: ostream&amp;运算符&lt;&lt;函数到我的Line类,但现在我收到以下错误:

/home/ryu/qt_workspace/hello/main.cpp:67: error: 'std::ostream& Line::operator<<(std::ostream&, const Line&)' must take exactly one argument

/home/ryu/qt_workspace/hello/main.cpp:77: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'

此致 奥勒利安

2 个答案:

答案 0 :(得分:2)

如果您想使用cout <<,可以采用更直接的方式。

将此功能添加到Line

friend std::ostream& operator << ( std::ostream & os, const Line & l ){
    os << "[ " << l.p1 << " -> " << l.p2 << " ]";
    return os;
}

您还应注意您的方法是返回无效内存 - 这是Java与C ++不同的重要方式。

    return stream.str().c_str();  // Danger!
stream中声明了{p> operator const char*(),这限制了它的生命周期。退出该范围时会被销毁。因此,您将返回指向不再存在的内容的指针。

答案 1 :(得分:0)

实际上我认为使用C ++ 11返回字符串的值非常好,所以你可以在那里进行传输而不是使用下面的cstring。

What are move semantics?