Нет совпадения с 'operator >>' в моей функции-члене класса, используя set и get для чтения файла - PullRequest
0 голосов
/ 15 апреля 2020

Так что я пытаюсь создать функцию, которая использует мой набор и получить методы для чтения ввода из файла, в мой класс. Я должен удалить дружбу из следующего метода: friend istream & operator>>(istream & input, Date & D и использовать мои собственные методы get и set. Это то, что у меня есть в классе, в котором я получаю ошибку, Date.h

#if !defined(_DATE_H)
#define _DATE_H

#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>

using namespace std;

class Date {
public:
    Date();
    Date(unsigned day1, string month1, unsigned year1);

    void SetDay(unsigned day1);
    void SetMonth(string month1);
    void SetYear(unsigned year1);
    unsigned GetDay() const;
    string GetMonth() const;
    unsigned GetYear() const;

    void SetDate(istream &input, Date & D);
    void GetDate(ostream & os, Date & D);


private:

    unsigned day;
    string month;
    unsigned year;

};

 ostream & operator <<(ostream & os, Date & D);
 istream & operator >>(istream & input, const Date & D);
#endif  //_DATE_H

И это мой. cpp файл:

//
//
//  Generated by StarUML(tm) C++ Add-In


#include "Date.h"

Date::Date(unsigned day1, string month1, unsigned year1) {

    day = day1;
    month = month1;
    year = year1;

}


void Date::SetDay(unsigned day1) {

    day = day1;

}

void Date::SetMonth(string month1) {

    month = month1;

}

void Date::SetYear(unsigned year1) {

    year = year1;

}

unsigned Date::GetDay() const {

    return day;

}

string Date::GetMonth() const {

    return month;

}

unsigned Date::GetYear() const {

    return year;

}
istream & operator >>( istream & input, Date & D) {

    D.SetDate(input,D);
    return input;

}

ostream & operator <<( ostream & os, Date & D) {

    D.GetDate(os,D);

    return os;

}
void Date::SetDate(istream &input, Date & D){

    input >> D.SetDay(day) >> D.SetMonth(month) >> D.SetYear(year);
    input.ignore();

}

void Date::GetDate(ostream &os, Date & D){

    os << "  Date: " << D.GetDay() << " " << D.GetMonth() << " " << D.GetYear() << '\n';

}

Я получаю ошибка error: no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream<char>}' and 'void')|. Что это значит и как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Оператор

input >> D.SetDay(day) >> D.SetMonth(month) >> D.SetYear(year);

не имеет смысла, поскольку функции ничего не возвращают.

Один из способов решения вашей проблемы - создать временные переменные (например, day, month и year) и прочитайте их. Затем вызовите функции набора отдельно, передавая переменные.

С другой стороны, не вводите input.ignore() в вашу функцию ввода (и не печатайте новую строку в функции вывода), это зависит от пользователя. функций ввода / вывода, чтобы справиться с этим.

1 голос
/ 15 апреля 2020

Вы используете свои методы неправильно.

void Date::SetDate(istream &input, Date & D){

    input >> D.SetDay(day) >> D.SetMonth(month) >> D.SetYear(year);
    input.ignore();

}

D.SetDay возвращает void и не может использоваться таким образом. Вы можете исправить это так:

void Date::SetDate(istream &input, Date & D){
    unsigned day_in;
    string month_in;
    unsigned year_in;
    input >> day_in >> month_in >> year_in;
    D.SetDay(day_in);
    D.SetMonth(month_in);
    D.SetYear(year_in);
}

Однако, есть причина быть таким многословным. Поскольку SetDate является функцией-членом, ей не нужно передавать объект Date, и он может напрямую обращаться к закрытым членам:

void Date::SetDate(istream &input){
    input >> day >> month >> year;
}

Чем больше idomati c, тем лучше предоставить >> Перегрузка как свободная функция:

std::istream& (std::istream &in, Date& d){
    input >> d.day >> d.month >> d.year;
}

Но вам нужно объявить его как friend из Day, чтобы он мог получить доступ к закрытым членам.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...