Перегрузка оператора вывода << в классе C++

254
02 августа 2017, 21:39

Помогите, пожалуйста, разобраться в программе. Изучаю C++ и дошел до перегрузки операторов. Мне нужно сделать следующее: реализовать класс Date, который будет хранить день, месяц и год, сделать инициализацию этого класса, а также перегрузкой оператора << вывести эту дату на экран в формате (1, 1, 2000). Класс я реализовал и перегрузку тоже, но выдает ошибку и ничего не могу поделать.

P.S. Перегрузку оператора нужно реализовать в классе, не за ее пределами (если это возможно)

Сам код: `

class Date {
    int day;
    int month;
    int year;
public:
    Date(int d, int m, int y)
        : day {d}, month {m}, year {y} { }
    int getDay() { return day; }
    int getMonth() { return month; }
    int getYear() { return year; }        
    ostream &operator<<(ostream &os) {
        return os  << '(' << getDay() << '.' << getMonth()
        << '.' << getYear() << ')' << endl;
    }
};

int main() {
    Date dd {10, 10, 2010};
    cout << dd;
    return 0;
}

`

Ошибка:
In function 'int main()': error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'Date') cout << dd; ~~~~~^~~~~

Answer 1

Вы создали оператор, который работает наоборот :)

dd << cout;

Вот как нужно - оператор должен быть свободной функцией:

class Date {
    int day;
    int month;
    int year;
public:
    Date(int d, int m, int y)
        : day {d}, month {m}, year {y} { }
    int getDay()  const { return day; }
    int getMonth()const { return month; }
    int getYear() const { return year; }        
};
ostream& operator<<(ostream &os, const Date& d) {
    return os  << '(' << d.getDay() << '.' << d.getMonth()
        << '.' << d.getYear() << ')' << endl;
}

int main() {
    Date dd {10, 10, 2010};
    cout << dd << endl;
    return 0;
}
Answer 2
#include <iostream>
#include <ostream>
using namespace std;
class Date {
    int day;
    int month;
    int year;
public:
    Date(int d, int m, int y)
        : day {d}, month {m}, year {y} { }
    int getDay() const { return day; }
    int getMonth() const { return month; }
    int getYear() const { return year; }
    friend ostream &operator<<(ostream &os, const Date &_date) {
        return os  << '(' << _date.getDay() << '.' << _date.getMonth()
        << '.' << _date.getYear() << ')' << endl;
    }
};

int main() {
    Date dd {10, 10, 2010};
    cout << dd;
    return 0;
}
READ ALSO
Как пользоваться компилятором Visual C++ из nuget?

Как пользоваться компилятором Visual C++ из nuget?

В nuget есть тулсет Visual C++: VisualCppToolsCommunity

391
&lt;classname&gt; does not name a type

<classname> does not name a type

Здравствуйте!

349
Как изменить значение WSA_MAXIMUM_WAIT_EVENTS?

Как изменить значение WSA_MAXIMUM_WAIT_EVENTS?

Например для FD_SET значение задается через FD_SETSIZEА как изменить значение константы WSA_MAXIMUM_WAIT_EVENTS?

332
Парсинг EBML Void элемент

Парсинг EBML Void элемент

Добрый день , хочу предупредить , что с такого рода заданиями сталкиваюсь в первые , потому могу спрашивать для кого-то очевидные вещи , прошу...

325