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

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

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

expected primary-expression before '.' token

и нижний — просто пережиток того, чтобы бросить в него другое решение, но это ошибка объема.

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

0

Решение

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

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

#define STUDENT_H_INCLUDED
4

Другие решения

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

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

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

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

Как и в предыдущем операторе.

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

3

По вопросам рекламы [email protected]