在我的 class 成员函数中不匹配 'operator>>',使用 set 和 get 读取文件输入

No match for 'operator>>' in my class member function, using set and get to read file input

所以我正在尝试创建一个函数,利用我的 set 和 get 方法从文件读取输入到我的 class。我必须从以下方法中删除友谊:friend istream & operator>>(istream & input, Date & D 并使用我自己的 get 和 set 方法。这是我到目前为止在 class 中得到的错误,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')|。这是什么意思,我该如何解决?

声明

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

没有意义,因为这些函数 return 没有任何意义。

解决问题的一种方法是创建临时变量(例如 daymonthyear)并读入它们。然后分别调用set函数传递变量。

另外请注意,不要在输入函数中执行 input.ignore()(也不要在输出函数中打印换行符),这取决于 input/output 函数的用户处理那个。

你用错了方法。

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

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

}

D.SetDay returns 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;
}

更惯用的方法是提供一个 >> 重载作为自由函数:

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

但您需要将其声明为 Dayfriend 以便它可以访问私有成员。

PS:只有在写完这篇文章后,我才注意到您已经将重载作为自由函数。它可以直接实现输入,而不是调用 SetDate。您的 SetDate 没有添加任何有用的内容。