ООП C ++ первая ошибка компилятора

Пожалуйста, помогите этому новичку, вот мой код:

#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',

Программа должна вывести сумму комплексного числа.

2

Решение

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;
}

Реализация должна быть изменена в соответствии с вашими потребностями.

2

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

Комплекс не имеет оператора <<

ostream& Complex::operator << ( ostream& os )
{
// use os << field/method here to out put
return os;
}

Также, если комплекс может отображаться на консоли по-разному, вам следует подумать об использовании методов для отображения вместо cout <<

void Complex::DisplayToConsole()
{
std::cout << r << " " << i << '\n';
}
1

Вы должны перегрузить "<<" оператор для сложного типа.

#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;
}
1

Полный минимальный пример:

#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?

О том, как реализовать это в своем коде, я думаю, что другие ответы дают хорошие решения!

1

sumit(a) возвращает объект типа Complex, который cout не был определен для обработки.

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