实现提取和插入运算符 C++
Implementing the extraction and insertion operator C++
我有一个基本的 Student class(必须是 class)(是的,没有封装和命名空间污染,请原谅)我想创建自定义提取和插入运算符.找了无数遍还是不行。我有的是这个
#ifndef student
#define student
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
string name;
double score;
Student();
Student(string name, double score) : name(name), score(score) {}
friend ostream& operator<<(ostream &out, Student &student);
friend istream& operator>>(istream &in, Student &student);
};
#endif
#include "student.h"
ostream& operator<<(ostream &out, Student &student)
{
out << student.name << ", " << student.score;
return out;
}
istream& operator>>(istream &in, Student &student)
{
if (!in >> name || !in >> score)
{
in.setstate(ios::failbit);
}
return in;
}
我已经尝试了很多东西,从 this->name 到 Student::name 到 name 到 Student::student.name 到更改实际上最终起作用的函数签名,只是它实际上并没有使运算符过载.请停止:D
编辑:至于具体问题,就是在方法中访问Studentclass的成员。
student.name 和 student.score 正在抛出
expected primary-expression before '.' token
底部的一个只是向它抛出不同解决方案的遗迹,但它是范围错误。
Edit2:问题原来是在 header 中与守卫发生冲突被称为学生,因此 pre-processor 会在任何地方用核武器这个词学生 -_-
感谢帮助
我发现你的 >>
有一些问题
if (!in >> name || !in >> score)
!优先级高于>>,使用!(in >> student.name)
使用student.name和student.score
就像您在前面的运算符中所做的那样。
对 <<
运算符的第二个参数使用常量引用很有用。相应地更改好友声明。
评论和长颈鹿船长的回答都指出了各种问题。另一个更关键的问题是:
您在函数中声明了一个名为 student
的变量;但是你的头球实际上 #define
s student
在头球后卫中!所以你的 #define
d 符号与你的变量名冲突,导致你看到的错误。 header guard 的推荐语法类似于
#define STUDENT_H_INCLUDED
我有一个基本的 Student class(必须是 class)(是的,没有封装和命名空间污染,请原谅)我想创建自定义提取和插入运算符.找了无数遍还是不行。我有的是这个
#ifndef student
#define student
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
string name;
double score;
Student();
Student(string name, double score) : name(name), score(score) {}
friend ostream& operator<<(ostream &out, Student &student);
friend istream& operator>>(istream &in, Student &student);
};
#endif
#include "student.h"
ostream& operator<<(ostream &out, Student &student)
{
out << student.name << ", " << student.score;
return out;
}
istream& operator>>(istream &in, Student &student)
{
if (!in >> name || !in >> score)
{
in.setstate(ios::failbit);
}
return in;
}
我已经尝试了很多东西,从 this->name 到 Student::name 到 name 到 Student::student.name 到更改实际上最终起作用的函数签名,只是它实际上并没有使运算符过载.请停止:D
编辑:至于具体问题,就是在方法中访问Studentclass的成员。 student.name 和 student.score 正在抛出
expected primary-expression before '.' token
底部的一个只是向它抛出不同解决方案的遗迹,但它是范围错误。
Edit2:问题原来是在 header 中与守卫发生冲突被称为学生,因此 pre-processor 会在任何地方用核武器这个词学生 -_- 感谢帮助
我发现你的 >>
if (!in >> name || !in >> score)
!优先级高于>>,使用!(in >> student.name)
使用student.name和student.score
就像您在前面的运算符中所做的那样。
对 <<
运算符的第二个参数使用常量引用很有用。相应地更改好友声明。
评论和长颈鹿船长的回答都指出了各种问题。另一个更关键的问题是:
您在函数中声明了一个名为 student
的变量;但是你的头球实际上 #define
s student
在头球后卫中!所以你的 #define
d 符号与你的变量名冲突,导致你看到的错误。 header guard 的推荐语法类似于
#define STUDENT_H_INCLUDED