Реализация оператора извлечения и вставки C++

У меня есть базовый класс 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->name до Student::name до имени Student::student.name до изменения сигнатуры функции, которая действительно работала, за исключением того, что она фактически не перегружала оператор. пожалуйста помогите :D

Изменить: что касается конкретной проблемы, это доступ к члену класса Student в методе. student.name и student.score бросают

expected primary-expression before '.' token

а нижний - просто пережиток того, что на него бросают другое решение, но это ошибка области.

Edit2: проблема оказалась конфликтом с охранником в заголовке, называемым студентом, поэтому препроцессор везде уничтожал слово студент -_- Спасибо за помощь


person Boris N    schedule 08.02.2016    source источник
comment
Добро пожаловать в StackOverflow! Какое фактическое сообщение об ошибке вы получаете?   -  person mindriot    schedule 08.02.2016
comment
в operator>> нельзя просто взять name и score. Кроме того: вы на самом деле не говорите нам, в чем проблема (ошибка компилятора? укажите точный текст. ошибка времени выполнения? сообщите нам, на какой строке возникает ошибка).   -  person crashmstr    schedule 08.02.2016
comment
Два быстрых замечания: (1) в вашем operator<<() вы должны использовать const Student& (объект не изменяется). (2) В вашей реализации operator>>() вы можете просто написать return (in >> name >> score);, не нужно беспокоиться о состоянии самостоятельно, о нем позаботятся.   -  person mindriot    schedule 08.02.2016
comment
И да, чтобы расширить комментарий @crashmstr: вам нужно использовать student.name и student.score.   -  person mindriot    schedule 08.02.2016
comment
для верхнего, student.name ожидал первичного выражения перед '.' токен, и нижняя часть определенно не правильная, но это проблема области   -  person Boris N    schedule 08.02.2016
comment
Не помещайте директивы using namespace в заголовочный файл   -  person Joel Cornett    schedule 08.02.2016
comment
У вас есть #ifndef student, тогда используйте student в качестве имени переменной. Включать охранников следует чем-то более внятным (Поскольку вы #define student, то ваше имя параметра проблематично).   -  person crashmstr    schedule 08.02.2016
comment
@JoelCornett Это связано с загрязнением пространства имен или есть другая причина. Я довольно новичок в С++. Спасибо.   -  person Boris N    schedule 08.02.2016
comment
@BorisN Да, это из-за загрязнения пространства имен. См., например, здесь stackoverflow.com /вопросы/14575799/   -  person Captain Giraffe    schedule 08.02.2016
comment
Не вставляйте [Решено] в заголовок. Отметьте наиболее полезный для вас ответ.   -  person Captain Giraffe    schedule 08.02.2016
comment
@CaptainGiraffe исправил это. Извините, я новичок. :D (пожалуйста, не убивайте меня :P) нет, спасибо за информацию, я обязательно сделаю это в следующий раз.   -  person Boris N    schedule 09.02.2016


Ответы (2)


В комментариях и в ответе капитана Жирафа были указаны различные проблемы. Другая более важная проблема заключается в следующем:

Вы объявляете переменную с именем student в своих функциях; но ваш заголовок на самом деле #defines student в защите заголовка! Таким образом, ваш символ #defined конфликтует с именем вашей переменной, что приводит к ошибкам, которые вы видите. Рекомендуемый синтаксис для защиты заголовка выглядит примерно так:

#define STUDENT_H_INCLUDED
person mindriot    schedule 08.02.2016
comment
о теперь я получаю сообщение об ошибке на studnet.name и student.score ... я тупой :D спасибо. Я думаю, eclipse _guard лучше, чем я думал. - person Boris N; 08.02.2016
comment
Или, если можете, #pragma once и избавьтесь от охранников. - person DeathTails; 08.02.2016

Я вижу несколько проблем с вашим >>

if (!in >> name || !in >> score)

! имеет более высокий приоритет, чем >>, используйте !(в >> student.name)

используйте student.name и student.score

Так же, как и в предыдущем операторе.

Полезно использовать константную ссылку на второй аргумент для оператора <<. Измените объявление друга соответствующим образом.

person Captain Giraffe    schedule 08.02.2016
comment
спасибо, я заметил это в основном файле, но я думаю, что это вылетело из головы из-за ошибок. Спасибо - person Boris N; 08.02.2016
comment
Кроме того, настройка failbit — плохая идея, потому что если in >> не удалось, то она уже установила это. Функция может быть просто in >> student.name >> student.score; return in; - person M.M; 08.02.2016
comment
Ах, цепочка. Забыл об этом. Хорошее предложение - person Boris N; 08.02.2016
comment
@MM Действительно, как уже отмечали другие. - person Captain Giraffe; 08.02.2016