在我的 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 没有任何意义。
解决问题的一种方法是创建临时变量(例如 day
、month
和 year
)并读入它们。然后分别调用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;
}
但您需要将其声明为 Day
的 friend
以便它可以访问私有成员。
PS:只有在写完这篇文章后,我才注意到您已经将重载作为自由函数。它可以直接实现输入,而不是调用 SetDate
。您的 SetDate
没有添加任何有用的内容。
所以我正在尝试创建一个函数,利用我的 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 没有任何意义。
解决问题的一种方法是创建临时变量(例如 day
、month
和 year
)并读入它们。然后分别调用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;
}
但您需要将其声明为 Day
的 friend
以便它可以访问私有成员。
PS:只有在写完这篇文章后,我才注意到您已经将重载作为自由函数。它可以直接实现输入,而不是调用 SetDate
。您的 SetDate
没有添加任何有用的内容。