Пожалуйста, помогите этому новичку, вот мой код:
#include <iostream>
using namespace std;
class Complex {
private:
float r, i;
public:
Complex(float rr, float ii) : r(rr), i (ii) {}
float GiveRe () { return r; }
float GiveIm () { return i; }
void Setit (float rr, float ii) {
r = rr;
i = ii;
}
};
Complex a(10, 20);
Complex sumit (Complex &ref) {
static Complex sum (0, 0);
sum.Setit(sum.GiveRe() + ref.GiveRe(), sum.GiveIm() + ref.GiveIm());
return sum;
}
int main () {
Complex sumvalue = sumit (a);
cout << sumvalue << endl;
return 0;
}
ошибка: no match for 'operator<<' in 'std::cout << sumvalue'
,
Программа должна вывести сумму комплексного числа.
Cout не может сказать, что вы хотите вывести, вам нужно указать оператор<< в классе или сделать возможным неявное преобразование вашего класса в совместимый тип.
http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/
Код Рудольфа Мюльбауэра, реализованный в вашем классе:
Добавьте это где-нибудь в заголовке класса:
friend ostream& operator<<(ostream& out, const Complex& compl);
и это под заголовком:
ostream& operator<<(ostream& out, const Complex& compl)
{
return out << compl.r << "/" << compl.i;
}
Реализация должна быть изменена в соответствии с вашими потребностями.
Комплекс не имеет оператора <<
ostream& Complex::operator << ( ostream& os )
{
// use os << field/method here to out put
return os;
}
Также, если комплекс может отображаться на консоли по-разному, вам следует подумать об использовании методов для отображения вместо cout <<
void Complex::DisplayToConsole()
{
std::cout << r << " " << i << '\n';
}
Вы должны перегрузить "<<"
оператор для сложного типа.
#include <iostream>
using namespace std;
class Complex {
private:
float r, i;
public:
Complex(float rr, float ii) : r(rr), i (ii) {}
float GiveRe () { return r; }
float GiveIm () { return i; }
void Setit (float rr, float ii) {
r = rr;
i = ii;
}
};
ostream& operator<<(ostream& os, Complex& c)
{
float i;
os<<c.GiveRe();
if(c.GiveIm() < 0){
os<<"-j"<<c.GiveIm()*(-1);
}else{
os<<"+j"<<c.GiveIm();
}
return os;
}
Complex a(10, 20);
Complex sumit (Complex &ref) {
static Complex sum (0, 0);
sum.Setit(sum.GiveRe() + ref.GiveRe(), sum.GiveIm() + ref.GiveIm());
return sum;
}
int main () {
Complex sumvalue = sumit (a);
cout << sumvalue << endl;
return 0;
}
Полный минимальный пример:
#include <iostream>
using namespace std;
class C {
public:
int r, l;
// if the operator needs access to private fields:
friend ostream& operator<< (ostream&, const C&);
};
ostream& operator << (ostream& stream, const C& c) {
stream << c.r << "--" << c.l;
return stream;
}
int main() {
C c;
c.l = 1;
c.r = 2;
cout << c << endl;
}
C ++ позволяет вам определять операторы. STL использует <<
оператор для вывода, и вся иерархия классов istream / ostream использует этот оператор для ввода / вывода.
Операторы реализованы как функции, но всегда следуют очень специфическому синтаксису. Как в примере, ostream& operator << (ostream&, const MYTYPEHERE&)
это способ определить ostream <<
операторы.
Когда C ++ встречает оператор, он должен определить типы всех операндов и найти (действительно волшебным образом) решение вопроса: учитывая мои операнды и операторы, могу ли я найти типизацию таким образом, чтобы оператор стал действительным?
Эти операторы ofstream определены для всех основных типов где-то в <iostream>
так что если вы напишите cout << 10
компилятор находит оператор ostream& operator<< (ostream&, int)
,
Если вы хотите иметь возможность использовать пользовательские типы в этой игре, вы должны определить операторов. в противном случае, заявление cout << sometype
не будет действительным Это также причина грубых ошибок компилятора, иногда встречающихся в C ++: «Ну, у меня есть несколько операторов << определяется, но ни один не совместим с вашим типом! «
Поскольку иногда не выгодно реализовывать операторы для ваших типов (если вы выводите их только один раз, например), я предложил написать:
cout << sum.re << "--" << sum.im << endl; // or similar
Таким образом, вы пишете меньше кода, и вы гибки в формате вывода. Кто знает, хотите ли вы, чтобы в следующий раз комплексное число форматировалось иначе? Но это другое обсуждение.
Зачем так сильно усложнять? Потому что C ++ может быть ужасно сложным. Это очень мощный, но забитый особым синтаксисом и исключениями. В конце концов, разница с C заключается именно в этом: C ++ намного лучше справляется с выводом типов (необходим для шаблонов), что часто приводит к WTF?
О том, как реализовать это в своем коде, я думаю, что другие ответы дают хорошие решения!
sumit(a)
возвращает объект типа Complex
, который cout
не был определен для обработки.