实现提取和插入运算符C ++

时间:2016-02-08 20:36:43

标签: c++ extraction insertion extraction-operator

我有一个基本的Student类(必须是一个类)(是的,没有封装和名称空间污染请原谅),我想创建自定义提取和插入操作符。经过无数次搜索后,它仍然无效。我拥有的是这个

#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-&gt; name到Student :: name来命名为Student :: student.name来改变实际上最终工作的函数签名,除了它实际上没有重载运算符。请停止:D

编辑:至于具体问题,它是在方法中访问Student类的成员。 student.name和student.score正在抛出

expected primary-expression before '.' token

而底部只是一个抛出不同解决方案的遗物,但它的范围错误。

Edit2:问题结果是与标题中的后卫被称为学生发生冲突,因此预处理器会在任何地方将“学生”这个词搞得一团糟-_- 谢谢你的帮助

2 个答案:

答案 0 :(得分:4)

在评论和长颈鹿船长的回答中已经指出了各种问题。另一个更关键的问题是:

在函数中声明一个名为student的变量;但是你的标题实际上是#define s student在标题后卫!因此,您的#define d符号会与您的变量名称冲突,从而导致您看到的错误。标题保护的推荐语法类似于

#define STUDENT_H_INCLUDED

答案 1 :(得分:3)

我发现您的>>

存在一些问题
if (!in >> name || !in >> score)

!优先级高于&gt;&gt;,请使用!(在&gt;&gt; student.name)

使用student.name和student.score

正如您在之前的运营商中所做的那样。

<<运算符的第二个参数使用const引用很有用。相应地更改好友声明。