2010-09-14 6 views
2

Я хочу перегружать < < оператора в классе линии, так что я могу напечатать объект, используя соиЬ так:Перегрузки << оператор в C++

cout << myLineObject << endl; 

, но это не работает:

class Line{ 
public: 
    float m; 
    float b; 
    string operator << (Line &line){return ("y = " + line.m + "x + " + line.b);}; 
}; 

я получаю:

Invalid operands of types 'const char [5]' and 'float' to binary 'operator+' 

Я также попытался с stringstream, но я даже м рудные ошибки. Каков правильный способ сделать это?

Спасибо;)

ответ

9

operator<< должен быть функцией, не являющейся членом, поскольку поток является левым аргументом. В вашем случае, поскольку элементы данных являются открытыми, он может быть реализован вне класса:

std::ostream& operator<<(std::ostream& stream, const Line& line) 
{ 
    return stream << "y = " << line.m << " x = " << line.b; 
} 
3

Гугле этот, выглядит отлично: Overloading <<

В основном, при перегрузке < < оператора для ввода-вывода, ваша функция должна выглядеть следующим образом:

friend ostream& operator<<(ostream& output, const YourClassHere& p); 

Обратите внимание, что оператор < < не является членом класса, а является внешней функцией (которая может быть дружественной, если вам это нужно). Такая функция должна использовать вывод для записи в нее, а затем возвращать ее, чтобы вы могли ее связать.

+0

Это правильное объявление, но вы не решили проблемы в теле функции. –

+0

Как написать тело описано в ссылке, которую я дал. В качестве примера есть пример класса Point, он почти точно совпадает с вопросом (Line). Поэтому я придумал идею привязки к материалу вместо c & p it (или идей, которые описаны там). –

16

Правильный способ указан везде перегружается <<, и вам удалось пропустить почти все.

Стандартная декларация ostream & operator<<(ostream & s, const & Line l); Это не может быть функцией-членом, и ей необходимо вернуть ссылку на ostream, чтобы вы могли цепочки <<, как обычно.

определение, в вашем случае, будет что-то вроде

ostream & operator<<(ostream & s, const & Line l) 
{ 
    return s << "y = " << l.m << "x + " << l.b; 
} 

Обратите внимание, что вы возвращаетесь поступающую ostream и печатать то, что вы, как с помощью оператора <<, а не с помощью оператора +. Это довольно просто, если вы следуете за этой формой .

В этом случае члены данных являются общедоступными (что вообще не является хорошей идеей), , поэтому проблем с доступом нет. Если вам нужно получить недопустимые значения (потому что они private и не отображаются в открытом интерфейсе), вам необходимо объявить оператором как friend в определении класса.

+0

'l' должно быть' строка' для второго аргумента (или 'строка' должна быть' l' в теле функции). –

+0

@Steven: Спасибо. Я редактировал, чтобы соответствовать. –

0

Ошибка здесь не имеет ничего общего с перегрузкой оператора, хотя когда-то решена, вы можете иметь больше вопросов о том, что. Эта ошибка возникает из-за отсутствия operator+, которая принимает аргументы const char[5] и float.Так как вы пытаетесь объединить строки формы этих четыре арга

"y = " + line.m + "x + " + line.b 

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

ostringstream concat; 
concat << string("y = ") << line.m << string("x + ") << line.b; 
return concat.str(); 

После того, как вы пройти это, вы можете работать на вашем << перегрузки логики.

0

Вы можете сделать это так:

class Line{ 
    public: 
    float m; 
    float b; 
    friend ostream& operator<< (ostream& out, Line& object) { 
    out << object.m << endl; 
    out << object.b << endl; 
    return out; 
    } 
}; 

Тогда вы можете сделать: соиЬ < < < < your_Line_object епсИ;

0

Другие объяснили правильный путь. Я решил, что упомянул бы, что вы делаете неправильно.

Вы определяете оператор, который принимает два объекта строки:

Line a; 
Line b; 
string c = a << b; 
// c would have the string values for line b 
// the values of line a would be ignored. 

Конечно, это не ошибка, которую вы видите. Это вызвано линией "y = " + line.m. «y =» - char [5]. amd line.m - это float, и нет оператора +, который принимает эти два (это не Basic - или C#).

Проблема в том, что C++ не имеет простого способа «добавить» нестрочные значения в строку. Вот почему мы используем соглашение cout <<.

Смежные вопросы