C ++ Ostringstream странное поведение при использовании цепочки в Cout

Я новичок в 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<

Но, если я запустил программу как есть, со вторым блоком закомментированным (у меня есть 2 версии оператора const *, и по умолчанию второй закомментирован), он отобразит

[(1, 2) -> (1, 2)]

Но при работе со вторым блоком без комментариев, вывод будет таким, как ожидалось:

[(1, 2) -> (3, 4)]

Проблема возникает, когда я отображаю оба объекта Point в одной строке (какая-то цепочка, хотя я не знаю, правильное ли здесь слово цепочка)

Мой вопрос: почему это происходит?

ОБНОВИТЬ

Я добавил std :: ostream& оператор << функция моего класса 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>&&'

С Уважением,
Аврелиан

1

Решение

Если вы хотите использовать 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 был объявлен в operator const char*() что ограничивает его время жизни этой функцией. Он уничтожается при выходе из этой области. В результате вы возвращаете указатель на то, что больше не существует.

2

Другие решения

на самом деле, я думаю, что в C ++ 11 возвращение строки по значению совершенно нормально, поэтому вы можете выполнять перенос туда вместо использования cstring внизу.

Что такое семантика перемещения?

0

По вопросам рекламы [email protected]