У меня есть базовый класс 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: проблема оказывается в конфликте с охранником в заголовке, называемом учеником, таким образом, препроцессор везде обнуляет слово ученик -_-
Спасибо за помощь
Различные проблемы были отмечены в комментариях и в ответе капитана Жирафа. Еще одна более важная проблема заключается в следующем:
Вы объявляете переменную с именем student
в ваших функциях; но ваш заголовок на самом деле #define
s student
в заголовке гвардии! Так что ваши #define
Символ d конфликтует с именем вашей переменной, что приводит к ошибкам, которые вы видите. Рекомендуемый синтаксис для защиты заголовка что-то вроде
#define STUDENT_H_INCLUDED
Я вижу несколько проблем с вашим >>
if (!in >> name || !in >> score)
! имеет более высокий приоритет, чем >>, используйте! (in >> student.name)
используйте student.name и student.score
Как и в предыдущем операторе.
Полезно использовать константную ссылку на второй аргумент для <<
оператор. Измените объявление друга соответственно.