У меня есть базовый класс 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: проблема оказалась конфликтом с охранником в заголовке, называемым студентом, поэтому препроцессор везде уничтожал слово студент -_- Спасибо за помощь
operator>>
нельзя просто взятьname
иscore
. Кроме того: вы на самом деле не говорите нам, в чем проблема (ошибка компилятора? укажите точный текст. ошибка времени выполнения? сообщите нам, на какой строке возникает ошибка). - person crashmstr   schedule 08.02.2016operator<<()
вы должны использоватьconst Student&
(объект не изменяется). (2) В вашей реализацииoperator>>()
вы можете просто написатьreturn (in >> name >> score);
, не нужно беспокоиться о состоянии самостоятельно, о нем позаботятся. - person mindriot   schedule 08.02.2016student.name
иstudent.score
. - person mindriot   schedule 08.02.2016using namespace
в заголовочный файл - person Joel Cornett   schedule 08.02.2016#ifndef student
, тогда используйтеstudent
в качестве имени переменной. Включать охранников следует чем-то более внятным (Поскольку вы#define student
, то ваше имя параметра проблематично). - person crashmstr   schedule 08.02.2016