Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

Перегрузка оператора вывода <<

#cpp #перегрузка_операторов


Для опытов со структурами данных написал такую структуру:

typedef struct complex{
    double real;
    double imaginary;
public:
    std::ostream& operator <<(std::ostream &os, complex &c){
        os << "(" << c.real << ", " << c.imaginary << ")";
        return os;
    }
}complex;


При компиляции выдается сообщение о том, что оператор должен принимать единственный
аргумент. Я думаю, что проблема в том, что я здесь использую структуру вместо класса
(примеров с классами и в интернете много). Но класс мне кажется слишком тяжелым для
комплексного числа, классы нужны для абстрагирования целых сущностей со сложным строением
и действиями, а здесь и делать-то нечего. Как можно исправить?
    


Ответы

Ответ 1



Определенный вами оператор как функция член класса имеет неявный параметр - указатель на экземпляр класса, то есть this. В результате он имеет, фактически три параметра вместо двух, как полагается для этого бинарного оператора. Либо объявите функцию со спецификатором friend. Либо вынесите определение (и, соответственно, объявление) функции за пределы класса. То есть сделайте ее не функцией - членом класса. Имейте в виду, что так как вы используете ключевое слово struct в объявлении класса, то его члены real и imaginary имеют по умолчанию класс доступа public Итак, либо напишите struct complex{ //private: double real; double imaginary; friend std::ostream& operator <<(std::ostream &os, const complex &c){ os << "(" << c.real << ", " << c.imaginary << ")"; return os; } }; Либо typedef struct complex{ double real; double imaginary; }complex; std::ostream& operator <<(std::ostream &os, const complex &c){ os << "(" << c.real << ", " << c.imaginary << ")"; return os; }

Комментариев нет:

Отправить комментарий